summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--clang/lib/AST/ODRHash.cpp2
-rw-r--r--clang/test/Modules/Inputs/odr_hash-Friend/Box.h14
-rw-r--r--clang/test/Modules/Inputs/odr_hash-Friend/M1.h6
-rw-r--r--clang/test/Modules/Inputs/odr_hash-Friend/M2.h5
-rw-r--r--clang/test/Modules/Inputs/odr_hash-Friend/M3.h7
-rw-r--r--clang/test/Modules/Inputs/odr_hash-Friend/module.modulemap15
-rw-r--r--clang/test/Modules/odr_hash-Friend.cpp19
7 files changed, 68 insertions, 0 deletions
diff --git a/clang/lib/AST/ODRHash.cpp b/clang/lib/AST/ODRHash.cpp
index 088d8bedd45..38e8d34135f 100644
--- a/clang/lib/AST/ODRHash.cpp
+++ b/clang/lib/AST/ODRHash.cpp
@@ -478,6 +478,8 @@ void ODRHash::AddFunctionDecl(const FunctionDecl *Function) {
// 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;
diff --git a/clang/test/Modules/Inputs/odr_hash-Friend/Box.h b/clang/test/Modules/Inputs/odr_hash-Friend/Box.h
new file mode 100644
index 00000000000..01ab90d601c
--- /dev/null
+++ b/clang/test/Modules/Inputs/odr_hash-Friend/Box.h
@@ -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);
+ }
+};
diff --git a/clang/test/Modules/Inputs/odr_hash-Friend/M1.h b/clang/test/Modules/Inputs/odr_hash-Friend/M1.h
new file mode 100644
index 00000000000..202ad06c348
--- /dev/null
+++ b/clang/test/Modules/Inputs/odr_hash-Friend/M1.h
@@ -0,0 +1,6 @@
+#include "Box.h"
+
+void Peek() {
+ Box<> Gift;
+ Gift.test();
+}
diff --git a/clang/test/Modules/Inputs/odr_hash-Friend/M2.h b/clang/test/Modules/Inputs/odr_hash-Friend/M2.h
new file mode 100644
index 00000000000..69f08a957ed
--- /dev/null
+++ b/clang/test/Modules/Inputs/odr_hash-Friend/M2.h
@@ -0,0 +1,5 @@
+#include "Box.h"
+void x() {
+ Box<> Unused;
+ //Unused.test();
+}
diff --git a/clang/test/Modules/Inputs/odr_hash-Friend/M3.h b/clang/test/Modules/Inputs/odr_hash-Friend/M3.h
new file mode 100644
index 00000000000..ab457e0c08f
--- /dev/null
+++ b/clang/test/Modules/Inputs/odr_hash-Friend/M3.h
@@ -0,0 +1,7 @@
+#include "Box.h"
+#include "M2.h"
+
+void Party() {
+ Box<> Present;
+ Present.test();
+}
diff --git a/clang/test/Modules/Inputs/odr_hash-Friend/module.modulemap b/clang/test/Modules/Inputs/odr_hash-Friend/module.modulemap
new file mode 100644
index 00000000000..28e1832e30e
--- /dev/null
+++ b/clang/test/Modules/Inputs/odr_hash-Friend/module.modulemap
@@ -0,0 +1,15 @@
+module Box {
+ header "Box.h"
+}
+
+module Module1 {
+ header "M1.h"
+}
+
+module Module2 {
+ header "M2.h"
+}
+
+module Module3 {
+ header "M3.h"
+}
diff --git a/clang/test/Modules/odr_hash-Friend.cpp b/clang/test/Modules/odr_hash-Friend.cpp
new file mode 100644
index 00000000000..408e7f36b06
--- /dev/null
+++ b/clang/test/Modules/odr_hash-Friend.cpp
@@ -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;
+}
OpenPOWER on IntegriCloud