diff --git a/clang/lib/Serialization/ASTReaderDecl.cpp b/clang/lib/Serialization/ASTReaderDecl.cpp --- a/clang/lib/Serialization/ASTReaderDecl.cpp +++ b/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? } diff --git a/clang/test/Modules/odr_hash.mm b/clang/test/Modules/odr_hash.mm --- a/clang/test/Modules/odr_hash.mm +++ b/clang/test/Modules/odr_hash.mm @@ -241,12 +241,12 @@ @end @interface Interface5 { @public - T x; + T y; } @end @interface Interface6 { @public - T1 x; + T1 z; } @end #elif defined(SECOND) @@ -257,14 +257,21 @@ @end @interface Interface5 { @public - T x; + T y; } @end @interface Interface6 { @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