r285160 - [modules] Fix assert if multiple update records provide a definition for a

Richard Smith via cfe-commits cfe-commits at lists.llvm.org
Tue Oct 25 19:31:57 PDT 2016


Author: rsmith
Date: Tue Oct 25 21:31:56 2016
New Revision: 285160

URL: http://llvm.org/viewvc/llvm-project?rev=285160&view=rev
Log:
[modules] Fix assert if multiple update records provide a definition for a
class template specialization and that specialization has attributes.

Modified:
    cfe/trunk/lib/Serialization/ASTReaderDecl.cpp
    cfe/trunk/test/Modules/Inputs/templates-left.h
    cfe/trunk/test/Modules/Inputs/templates-right.h
    cfe/trunk/test/Modules/Inputs/templates-top.h
    cfe/trunk/test/Modules/templates.mm

Modified: cfe/trunk/lib/Serialization/ASTReaderDecl.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Serialization/ASTReaderDecl.cpp?rev=285160&r1=285159&r2=285160&view=diff
==============================================================================
--- cfe/trunk/lib/Serialization/ASTReaderDecl.cpp (original)
+++ cfe/trunk/lib/Serialization/ASTReaderDecl.cpp Tue Oct 25 21:31:56 2016
@@ -3930,7 +3930,10 @@ void ASTDeclReader::UpdateDecl(Decl *D,
       if (Record[Idx++]) {
         AttrVec Attrs;
         Reader.ReadAttributes(F, Attrs, Record, Idx);
-        D->setAttrsImpl(Attrs, Reader.getContext());
+        // If the declaration already has attributes, we assume that some other
+        // AST file already loaded them.
+        if (!D->hasAttrs())
+          D->setAttrsImpl(Attrs, Reader.getContext());
       }
       break;
     }

Modified: cfe/trunk/test/Modules/Inputs/templates-left.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Inputs/templates-left.h?rev=285160&r1=285159&r2=285160&view=diff
==============================================================================
--- cfe/trunk/test/Modules/Inputs/templates-left.h (original)
+++ cfe/trunk/test/Modules/Inputs/templates-left.h Tue Oct 25 21:31:56 2016
@@ -70,3 +70,5 @@ namespace EmitDefaultedSpecialMembers {
 inline int *getStaticDataMemberLeft() {
   return WithUndefinedStaticDataMember<int[]>::undefined;
 }
+
+inline WithAttributes<int> make_with_attributes_left() { return WithAttributes<int>(); }

Modified: cfe/trunk/test/Modules/Inputs/templates-right.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Inputs/templates-right.h?rev=285160&r1=285159&r2=285160&view=diff
==============================================================================
--- cfe/trunk/test/Modules/Inputs/templates-right.h (original)
+++ cfe/trunk/test/Modules/Inputs/templates-right.h Tue Oct 25 21:31:56 2016
@@ -51,3 +51,5 @@ void outOfLineInlineUseRightH(void (OutO
 inline int *getStaticDataMemberRight() {
   return WithUndefinedStaticDataMember<int[]>::undefined;
 }
+
+inline WithAttributes<int> make_with_attributes_right() { return WithAttributes<int>(); }

Modified: cfe/trunk/test/Modules/Inputs/templates-top.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Inputs/templates-top.h?rev=285160&r1=285159&r2=285160&view=diff
==============================================================================
--- cfe/trunk/test/Modules/Inputs/templates-top.h (original)
+++ cfe/trunk/test/Modules/Inputs/templates-top.h Tue Oct 25 21:31:56 2016
@@ -58,3 +58,8 @@ namespace EmitDefaultedSpecialMembers {
 template<typename T> struct WithUndefinedStaticDataMember {
   static T undefined;
 };
+
+template<typename T> struct __attribute__((packed, aligned(2))) WithAttributes {
+  T value;
+};
+WithAttributes<int> *get_with_attributes();

Modified: cfe/trunk/test/Modules/templates.mm
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/templates.mm?rev=285160&r1=285159&r2=285160&view=diff
==============================================================================
--- cfe/trunk/test/Modules/templates.mm (original)
+++ cfe/trunk/test/Modules/templates.mm Tue Oct 25 21:31:56 2016
@@ -116,4 +116,9 @@ void testStaticDataMember() {
   (void) getStaticDataMemberRight();
 }
 
-
+void testWithAttributes() {
+  auto a = make_with_attributes_left();
+  auto b = make_with_attributes_right();
+  static_assert(alignof(decltype(a)) == 2, "");
+  static_assert(alignof(decltype(b)) == 2, "");
+}




More information about the cfe-commits mailing list