diff --git a/lib/AST/ODRHash.cpp b/lib/AST/ODRHash.cpp index 66b9940b8b08609dff0147c50885fdd5d283d70c..c16f4f336af5697bf89b64ccea756ce2e8fd22a2 100644 --- a/lib/AST/ODRHash.cpp +++ b/lib/AST/ODRHash.cpp @@ -246,7 +246,9 @@ public: } void VisitValueDecl(const ValueDecl *D) { - AddQualType(D->getType()); + if (!isa<FunctionDecl>(D)) { + AddQualType(D->getType()); + } Inherited::VisitValueDecl(D); } @@ -305,6 +307,8 @@ public: Hash.AddSubDecl(Param); } + AddQualType(D->getReturnType()); + Inherited::VisitFunctionDecl(D); } diff --git a/test/Modules/odr_hash.cpp b/test/Modules/odr_hash.cpp index ee45ae529961786180fd9b78be79d1d192789997..91230c52c8e0364a5870d0daf2df74c47a4bebab 100644 --- a/test/Modules/odr_hash.cpp +++ b/test/Modules/odr_hash.cpp @@ -517,6 +517,20 @@ S14 s14; // expected-error@second.h:* {{'Method::S14' has different definitions in different modules; first difference is definition in module 'SecondModule' found method 'A' with 1st parameter of type 'int *' decayed from 'int [3]'}} // expected-note@first.h:* {{but in 'FirstModule' found method 'A' with 1st parameter of type 'int *' decayed from 'int [2]'}} #endif + +#if defined(FIRST) +struct S15 { + int A() { return 0; } +}; +#elif defined(SECOND) +struct S15 { + long A() { return 0; } +}; +#else +S15 s15; +// expected-error@first.h:* {{'Method::S15::A' from module 'FirstModule' is not present in definition of 'Method::S15' in module 'SecondModule'}} +// expected-note@second.h:* {{declaration of 'A' does not match}} +#endif } // namespace Method // Naive parsing of AST can lead to cycles in processing. Ensure