r322350 - [ODRHash] Don't hash friend functions.

Richard Trieu via cfe-commits cfe-commits at lists.llvm.org
Tue Jan 16 11:27:48 PST 2018


There was a different, possibly related, issue with templated methods that
I just disabled checking for methods all together in r321396 until I can
investigate further.

On Mon, Jan 15, 2018 at 10:45 AM, David Blaikie <dblaikie at gmail.com> wrote:

> 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 at 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 at lists.llvm.org
>> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20180116/ddd14019/attachment.html>


More information about the cfe-commits mailing list