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

NAKAMURA Takumi via cfe-commits cfe-commits at lists.llvm.org
Wed Jan 17 00:52:42 PST 2018


That's good to hear. Thanks!

2018年1月17日(水) 13:51 Richard Trieu <rtrieu at google.com>:

> I feel it's best to merge this change into the release branch instead of
> reverting the previous change.  I've filed a bug to request this revision,
> and a few others that fix the test case, to be merged.
> https://bugs.llvm.org/show_bug.cgi?id=35981
>
>
> On Tue, Jan 16, 2018 at 2:44 PM, NAKAMURA Takumi <geek4civic at gmail.com>
> wrote:
>
>> 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/20180117/9d78030a/attachment-0001.html>


More information about the cfe-commits mailing list