vsapsai created this revision.
vsapsai added reviewers: rsmith, bruno, jansvoboda11.
Herald added a subscriber: ributzka.
vsapsai requested review of this revision.
Herald added a project: clang.

While working on https://reviews.llvm.org/D110280 I've tried to merge
decl contexts as it seems to be correct and matching our handling of
decl contexts from different modules. It's not required for the fix in
https://reviews.llvm.org/D110280 but it revealed a missing diagnostic,
so separating this change into a separate commit.

Renamed some variables to distinguish diagnostic like "declaration of
'x' does not match" for different cases.


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D110287

Files:
  clang/lib/Serialization/ASTReaderDecl.cpp
  clang/test/Modules/odr_hash.mm


Index: clang/test/Modules/odr_hash.mm
===================================================================
--- clang/test/Modules/odr_hash.mm
+++ clang/test/Modules/odr_hash.mm
@@ -241,12 +241,12 @@
 @end
 @interface Interface5 <T : I1 *> {
 @public
-  T<P1> x;
+  T<P1> y;
 }
 @end
 @interface Interface6 <T1 : I1 *, T2 : I2 *> {
 @public
-  T1 x;
+  T1 z;
 }
 @end
 #elif defined(SECOND)
@@ -257,14 +257,21 @@
 @end
 @interface Interface5 <T : I1 *> {
 @public
-  T<P1, P2> x;
+  T<P1, P2> y;
 }
 @end
 @interface Interface6 <T1 : I1 *, T2 : I2 *> {
 @public
-  T2 x;
+  T2 z;
 }
 @end
+#else
+// expected-error@first.h:* {{'Interface4::x' from module 'FirstModule' is not 
present in definition of 'Interface4' in module 'SecondModule'}}
+// expected-note@second.h:* {{declaration of 'x' does not match}}
+// expected-error@first.h:* {{'Interface5::y' from module 'FirstModule' is not 
present in definition of 'Interface5' in module 'SecondModule'}}
+// expected-note@second.h:* {{declaration of 'y' does not match}}
+// expected-error@first.h:* {{'Interface6::z' from module 'FirstModule' is not 
present in definition of 'Interface6' in module 'SecondModule'}}
+// expected-note@second.h:* {{declaration of 'z' does not match}}
 #endif
 
 namespace Types {
@@ -276,22 +283,22 @@
 };
 struct Invalid2 {
   Interface5 *I;
-  decltype(I->x) x;
+  decltype(I->y) y;
 };
 struct Invalid3 {
   Interface6 *I;
-  decltype(I->x) x;
+  decltype(I->z) z;
 };
 #else
 Invalid1 i1;
 // expected-error@first.h:* {{'Types::ObjCTypeParam::Invalid1::x' from module 
'FirstModule' is not present in definition of 'Types::ObjCTypeParam::Invalid1' 
in module 'SecondModule'}}
 // expected-note@second.h:* {{declaration of 'x' does not match}}
 Invalid2 i2;
-// expected-error@first.h:* {{'Types::ObjCTypeParam::Invalid2::x' from module 
'FirstModule' is not present in definition of 'Types::ObjCTypeParam::Invalid2' 
in module 'SecondModule'}}
-// expected-note@second.h:* {{declaration of 'x' does not match}}
+// expected-error@first.h:* {{'Types::ObjCTypeParam::Invalid2::y' from module 
'FirstModule' is not present in definition of 'Types::ObjCTypeParam::Invalid2' 
in module 'SecondModule'}}
+// expected-note@second.h:* {{declaration of 'y' does not match}}
 Invalid3 i3;
-// expected-error@first.h:* {{'Types::ObjCTypeParam::Invalid3::x' from module 
'FirstModule' is not present in definition of 'Types::ObjCTypeParam::Invalid3' 
in module 'SecondModule'}}
-// expected-note@second.h:* {{declaration of 'x' does not match}}
+// expected-error@first.h:* {{'Types::ObjCTypeParam::Invalid3::z' from module 
'FirstModule' is not present in definition of 'Types::ObjCTypeParam::Invalid3' 
in module 'SecondModule'}}
+// expected-note@second.h:* {{declaration of 'z' does not match}}
 #endif
 
 }  // namespace ObjCTypeParam
Index: clang/lib/Serialization/ASTReaderDecl.cpp
===================================================================
--- clang/lib/Serialization/ASTReaderDecl.cpp
+++ clang/lib/Serialization/ASTReaderDecl.cpp
@@ -1177,6 +1177,12 @@
 
 void ASTDeclReader::MergeDefinitionData(ObjCInterfaceDecl *D,
          struct ObjCInterfaceDecl::DefinitionData &&NewDD) {
+  struct ObjCInterfaceDecl::DefinitionData &DD = D->data();
+  if (DD.Definition != NewDD.Definition) {
+    Reader.MergedDeclContexts.insert(
+        std::make_pair(NewDD.Definition, DD.Definition));
+  }
+
   // FIXME: odr checking?
 }
 


Index: clang/test/Modules/odr_hash.mm
===================================================================
--- clang/test/Modules/odr_hash.mm
+++ clang/test/Modules/odr_hash.mm
@@ -241,12 +241,12 @@
 @end
 @interface Interface5 <T : I1 *> {
 @public
-  T<P1> x;
+  T<P1> y;
 }
 @end
 @interface Interface6 <T1 : I1 *, T2 : I2 *> {
 @public
-  T1 x;
+  T1 z;
 }
 @end
 #elif defined(SECOND)
@@ -257,14 +257,21 @@
 @end
 @interface Interface5 <T : I1 *> {
 @public
-  T<P1, P2> x;
+  T<P1, P2> y;
 }
 @end
 @interface Interface6 <T1 : I1 *, T2 : I2 *> {
 @public
-  T2 x;
+  T2 z;
 }
 @end
+#else
+// expected-error@first.h:* {{'Interface4::x' from module 'FirstModule' is not present in definition of 'Interface4' in module 'SecondModule'}}
+// expected-note@second.h:* {{declaration of 'x' does not match}}
+// expected-error@first.h:* {{'Interface5::y' from module 'FirstModule' is not present in definition of 'Interface5' in module 'SecondModule'}}
+// expected-note@second.h:* {{declaration of 'y' does not match}}
+// expected-error@first.h:* {{'Interface6::z' from module 'FirstModule' is not present in definition of 'Interface6' in module 'SecondModule'}}
+// expected-note@second.h:* {{declaration of 'z' does not match}}
 #endif
 
 namespace Types {
@@ -276,22 +283,22 @@
 };
 struct Invalid2 {
   Interface5 *I;
-  decltype(I->x) x;
+  decltype(I->y) y;
 };
 struct Invalid3 {
   Interface6 *I;
-  decltype(I->x) x;
+  decltype(I->z) z;
 };
 #else
 Invalid1 i1;
 // expected-error@first.h:* {{'Types::ObjCTypeParam::Invalid1::x' from module 'FirstModule' is not present in definition of 'Types::ObjCTypeParam::Invalid1' in module 'SecondModule'}}
 // expected-note@second.h:* {{declaration of 'x' does not match}}
 Invalid2 i2;
-// expected-error@first.h:* {{'Types::ObjCTypeParam::Invalid2::x' from module 'FirstModule' is not present in definition of 'Types::ObjCTypeParam::Invalid2' in module 'SecondModule'}}
-// expected-note@second.h:* {{declaration of 'x' does not match}}
+// expected-error@first.h:* {{'Types::ObjCTypeParam::Invalid2::y' from module 'FirstModule' is not present in definition of 'Types::ObjCTypeParam::Invalid2' in module 'SecondModule'}}
+// expected-note@second.h:* {{declaration of 'y' does not match}}
 Invalid3 i3;
-// expected-error@first.h:* {{'Types::ObjCTypeParam::Invalid3::x' from module 'FirstModule' is not present in definition of 'Types::ObjCTypeParam::Invalid3' in module 'SecondModule'}}
-// expected-note@second.h:* {{declaration of 'x' does not match}}
+// expected-error@first.h:* {{'Types::ObjCTypeParam::Invalid3::z' from module 'FirstModule' is not present in definition of 'Types::ObjCTypeParam::Invalid3' in module 'SecondModule'}}
+// expected-note@second.h:* {{declaration of 'z' does not match}}
 #endif
 
 }  // namespace ObjCTypeParam
Index: clang/lib/Serialization/ASTReaderDecl.cpp
===================================================================
--- clang/lib/Serialization/ASTReaderDecl.cpp
+++ clang/lib/Serialization/ASTReaderDecl.cpp
@@ -1177,6 +1177,12 @@
 
 void ASTDeclReader::MergeDefinitionData(ObjCInterfaceDecl *D,
          struct ObjCInterfaceDecl::DefinitionData &&NewDD) {
+  struct ObjCInterfaceDecl::DefinitionData &DD = D->data();
+  if (DD.Definition != NewDD.Definition) {
+    Reader.MergedDeclContexts.insert(
+        std::make_pair(NewDD.Definition, DD.Definition));
+  }
+
   // FIXME: odr checking?
 }
 
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to