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

Hans Wennborg via cfe-commits cfe-commits at lists.llvm.org
Wed Jan 17 03:43:51 PST 2018


Merged in r322632.

On Wed, Jan 17, 2018 at 9:52 AM, NAKAMURA Takumi via cfe-commits
<cfe-commits at lists.llvm.org> wrote:
> 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
>>
>>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
>


More information about the cfe-commits mailing list