r317147 - PR33746: Store the 'inline'ness of a static data member with the update record

Richard Smith via cfe-commits cfe-commits at lists.llvm.org
Wed Nov 1 18:06:00 PDT 2017


Author: rsmith
Date: Wed Nov  1 18:06:00 2017
New Revision: 317147

URL: http://llvm.org/viewvc/llvm-project?rev=317147&view=rev
Log:
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.

Added:
    cfe/trunk/test/Modules/cxx17-inline-variables.cpp
Modified:
    cfe/trunk/lib/Serialization/ASTReaderDecl.cpp
    cfe/trunk/lib/Serialization/ASTWriter.cpp

Modified: cfe/trunk/lib/Serialization/ASTReaderDecl.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Serialization/ASTReaderDecl.cpp?rev=317147&r1=317146&r2=317147&view=diff
==============================================================================
--- cfe/trunk/lib/Serialization/ASTReaderDecl.cpp (original)
+++ cfe/trunk/lib/Serialization/ASTReaderDecl.cpp Wed Nov  1 18:06:00 2017
@@ -3988,6 +3988,8 @@ void ASTDeclReader::UpdateDecl(Decl *D,
       VarDecl *VD = cast<VarDecl>(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());

Modified: cfe/trunk/lib/Serialization/ASTWriter.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Serialization/ASTWriter.cpp?rev=317147&r1=317146&r2=317147&view=diff
==============================================================================
--- cfe/trunk/lib/Serialization/ASTWriter.cpp (original)
+++ cfe/trunk/lib/Serialization/ASTWriter.cpp Wed Nov  1 18:06:00 2017
@@ -5084,6 +5084,8 @@ void ASTWriter::WriteDeclUpdatesBlocks(R
       case UPD_CXX_INSTANTIATED_STATIC_DATA_MEMBER: {
         const VarDecl *VD = cast<VarDecl>(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));

Added: cfe/trunk/test/Modules/cxx17-inline-variables.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/cxx17-inline-variables.cpp?rev=317147&view=auto
==============================================================================
--- cfe/trunk/test/Modules/cxx17-inline-variables.cpp (added)
+++ cfe/trunk/test/Modules/cxx17-inline-variables.cpp Wed Nov  1 18:06:00 2017
@@ -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 <class c, c e> struct ak { static constexpr c value = e; };
+ak<bool, true> 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<bool, true>::value; }
+
+#pragma clang module end
+#pragma clang module endbuild
+
+
+#pragma clang module import o
+#pragma clang module import a
+
+int main() { return ak<bool, true>::value; }




More information about the cfe-commits mailing list