From: Richard Smith Date: Thu, 2 Nov 2017 01:06:00 +0000 (+0000) Subject: PR33746: Store the 'inline'ness of a static data member with the update record X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=549aaf11afe537d779888d05324759c2f3ef83b5;p=clang PR33746: Store the 'inline'ness of a static data member with the update record for instantiating its definition. We model the 'inline'ness as being instantiated with the static data member in order to track whether the declaration has become a definition yet. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@317147 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Serialization/ASTReaderDecl.cpp b/lib/Serialization/ASTReaderDecl.cpp index 654a9fa94d..ae9efa9948 100644 --- a/lib/Serialization/ASTReaderDecl.cpp +++ b/lib/Serialization/ASTReaderDecl.cpp @@ -3988,6 +3988,8 @@ void ASTDeclReader::UpdateDecl(Decl *D, VarDecl *VD = cast(D); VD->getMemberSpecializationInfo()->setPointOfInstantiation( ReadSourceLocation()); + VD->NonParmVarDeclBits.IsInline = Record.readInt(); + VD->NonParmVarDeclBits.IsInlineSpecified = Record.readInt(); uint64_t Val = Record.readInt(); if (Val && !VD->getInit()) { VD->setInit(Record.readExpr()); diff --git a/lib/Serialization/ASTWriter.cpp b/lib/Serialization/ASTWriter.cpp index 7e88c59b35..dec8d8f7d7 100644 --- a/lib/Serialization/ASTWriter.cpp +++ b/lib/Serialization/ASTWriter.cpp @@ -5084,6 +5084,8 @@ void ASTWriter::WriteDeclUpdatesBlocks(RecordDataImpl &OffsetsRecord) { case UPD_CXX_INSTANTIATED_STATIC_DATA_MEMBER: { const VarDecl *VD = cast(D); Record.AddSourceLocation(Update.getLoc()); + Record.push_back(VD->isInline()); + Record.push_back(VD->isInlineSpecified()); if (VD->getInit()) { Record.push_back(!VD->isInitKnownICE() ? 1 : (VD->isInitICE() ? 3 : 2)); diff --git a/test/Modules/cxx17-inline-variables.cpp b/test/Modules/cxx17-inline-variables.cpp new file mode 100644 index 0000000000..be6a190a25 --- /dev/null +++ b/test/Modules/cxx17-inline-variables.cpp @@ -0,0 +1,30 @@ +// RUN: %clang_cc1 -std=c++17 -fsyntax-only -fmodules %s + +#pragma clang module build a +module a {} +#pragma clang module contents +#pragma clang module begin a + +template struct ak { static constexpr c value = e; }; +ak instantiate_class_definition; + +#pragma clang module end /* a */ +#pragma clang module endbuild + + +#pragma clang module build o +module o {} +#pragma clang module contents +#pragma clang module begin o +#pragma clang module import a + +inline int instantiate_var_definition() { return ak::value; } + +#pragma clang module end +#pragma clang module endbuild + + +#pragma clang module import o +#pragma clang module import a + +int main() { return ak::value; }