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

NAKAMURA Takumi via cfe-commits cfe-commits at lists.llvm.org
Tue Jan 16 14:44:40 PST 2018


If r322350 is temporary fix, I suggest r321395 may be reverted in
release_60. Richard, how do you think?

On Wed, Jan 17, 2018 at 4:27 AM Richard Trieu via cfe-commits <
cfe-commits at lists.llvm.org> wrote:

> 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
>>>
>>
> _______________________________________________
> 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/caf3a8cc/attachment-0001.html>


More information about the cfe-commits mailing list