r322350 - [ODRHash] Don't hash friend functions.
NAKAMURA Takumi via cfe-commits
cfe-commits at lists.llvm.org
Sat Jan 13 04:20:46 PST 2018
Could we pull this into release_60? It resolves an issue in r321395.
On Fri, Jan 12, 2018 at 1: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/20180113/e1488fd5/attachment-0001.html>
More information about the cfe-commits
mailing list