I'm surprised this problem is unique to friend functions with definitions inline and the friend declaration site - doesn't a similar issue occur with member functions of templates that are not instantiated in some (similar) contexts?
Is there a common solution that could be used for both cases? On Thu, Jan 11, 2018 at 8:43 PM Richard Trieu via cfe-commits < cfe-commits@lists.llvm.org> wrote: > 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 >
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits