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

Richard Trieu via cfe-commits cfe-commits at lists.llvm.org
Thu Jan 11 20:42:27 PST 2018


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;
+}




More information about the cfe-commits mailing list