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

David Blaikie via cfe-commits cfe-commits at lists.llvm.org
Mon Jan 15 10:45:19 PST 2018


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/20180115/1fae607f/attachment-0001.html>


More information about the cfe-commits mailing list