Author: rtrieu Date: Thu Jan 11 20:42:27 2018 New Revision: 322350 URL: http://llvm.org/viewvc/llvm-project?rev=322350&view=rev Log: [ODRHash] Don't hash friend functions.
In certain combinations of templated classes and friend functions, the body of friend functions does not get propagated along with function signature. Exclude friend functions for hashing to avoid this case. Added: cfe/trunk/test/Modules/Inputs/odr_hash-Friend/ cfe/trunk/test/Modules/Inputs/odr_hash-Friend/Box.h cfe/trunk/test/Modules/Inputs/odr_hash-Friend/M1.h cfe/trunk/test/Modules/Inputs/odr_hash-Friend/M2.h cfe/trunk/test/Modules/Inputs/odr_hash-Friend/M3.h cfe/trunk/test/Modules/Inputs/odr_hash-Friend/module.modulemap cfe/trunk/test/Modules/odr_hash-Friend.cpp Modified: cfe/trunk/lib/AST/ODRHash.cpp Modified: cfe/trunk/lib/AST/ODRHash.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/ODRHash.cpp?rev=322350&r1=322349&r2=322350&view=diff ============================================================================== --- cfe/trunk/lib/AST/ODRHash.cpp (original) +++ cfe/trunk/lib/AST/ODRHash.cpp Thu Jan 11 20:42:27 2018 @@ -478,6 +478,8 @@ void ODRHash::AddFunctionDecl(const Func // TODO: Fix hashing for class methods. if (isa<CXXMethodDecl>(Function)) return; + // And friend functions. + if (Function->getFriendObjectKind()) return; // Skip functions that are specializations or in specialization context. const DeclContext *DC = Function; Added: cfe/trunk/test/Modules/Inputs/odr_hash-Friend/Box.h URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Inputs/odr_hash-Friend/Box.h?rev=322350&view=auto ============================================================================== --- cfe/trunk/test/Modules/Inputs/odr_hash-Friend/Box.h (added) +++ cfe/trunk/test/Modules/Inputs/odr_hash-Friend/Box.h Thu Jan 11 20:42:27 2018 @@ -0,0 +1,14 @@ +template <class T> +struct iterator { + void Compare(const iterator &x) { } + friend void Check(iterator) {} +}; + +template <class T = int> struct Box { + iterator<T> I; + + void test() { + Check(I); + I.Compare(I); + } +}; Added: cfe/trunk/test/Modules/Inputs/odr_hash-Friend/M1.h URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Inputs/odr_hash-Friend/M1.h?rev=322350&view=auto ============================================================================== --- cfe/trunk/test/Modules/Inputs/odr_hash-Friend/M1.h (added) +++ cfe/trunk/test/Modules/Inputs/odr_hash-Friend/M1.h Thu Jan 11 20:42:27 2018 @@ -0,0 +1,6 @@ +#include "Box.h" + +void Peek() { + Box<> Gift; + Gift.test(); +} Added: cfe/trunk/test/Modules/Inputs/odr_hash-Friend/M2.h URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Inputs/odr_hash-Friend/M2.h?rev=322350&view=auto ============================================================================== --- cfe/trunk/test/Modules/Inputs/odr_hash-Friend/M2.h (added) +++ cfe/trunk/test/Modules/Inputs/odr_hash-Friend/M2.h Thu Jan 11 20:42:27 2018 @@ -0,0 +1,5 @@ +#include "Box.h" +void x() { + Box<> Unused; + //Unused.test(); +} Added: cfe/trunk/test/Modules/Inputs/odr_hash-Friend/M3.h URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Inputs/odr_hash-Friend/M3.h?rev=322350&view=auto ============================================================================== --- cfe/trunk/test/Modules/Inputs/odr_hash-Friend/M3.h (added) +++ cfe/trunk/test/Modules/Inputs/odr_hash-Friend/M3.h Thu Jan 11 20:42:27 2018 @@ -0,0 +1,7 @@ +#include "Box.h" +#include "M2.h" + +void Party() { + Box<> Present; + Present.test(); +} Added: cfe/trunk/test/Modules/Inputs/odr_hash-Friend/module.modulemap URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Inputs/odr_hash-Friend/module.modulemap?rev=322350&view=auto ============================================================================== --- cfe/trunk/test/Modules/Inputs/odr_hash-Friend/module.modulemap (added) +++ cfe/trunk/test/Modules/Inputs/odr_hash-Friend/module.modulemap Thu Jan 11 20:42:27 2018 @@ -0,0 +1,15 @@ +module Box { + header "Box.h" +} + +module Module1 { + header "M1.h" +} + +module Module2 { + header "M2.h" +} + +module Module3 { + header "M3.h" +} Added: cfe/trunk/test/Modules/odr_hash-Friend.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/odr_hash-Friend.cpp?rev=322350&view=auto ============================================================================== --- cfe/trunk/test/Modules/odr_hash-Friend.cpp (added) +++ cfe/trunk/test/Modules/odr_hash-Friend.cpp Thu Jan 11 20:42:27 2018 @@ -0,0 +1,19 @@ +// RUN: rm -rf %t + +// RUN: %clang_cc1 -fmodules -fmodules-cache-path=%t/modules.cache \ +// RUN: -I %S/Inputs/odr_hash-Friend \ +// RUN: -emit-obj -o /dev/null \ +// RUN: -fmodules \ +// RUN: -fimplicit-module-maps \ +// RUN: -fmodules-cache-path=%t/modules.cache \ +// RUN: -std=c++11 -x c++ %s -verify + +// expected-no-diagnostics + +#include "Box.h" +#include "M1.h" +#include "M3.h" + +void Run() { + Box<> Present; +} _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits