From: Richard Trieu Date: Fri, 14 Jul 2017 01:36:41 +0000 (+0000) Subject: [ODRHash] Avoid taking the types of FunctionDecl's X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=6e026d67f860337eb40392d743aaddbd5e750537;p=clang [ODRHash] Avoid taking the types of FunctionDecl's FunctionDecl already hashes most of the information in the function's type. Add hashing of the return type, and skip hashing the function's type to avoid redundancy and extra work when computing the hash. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@307986 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/AST/ODRHash.cpp b/lib/AST/ODRHash.cpp index 66b9940b8b..c16f4f336a 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(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 ee45ae5299..91230c52c8 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