summaryrefslogtreecommitdiffstats
path: root/clang/test
diff options
context:
space:
mode:
authorRichard Trieu <rtrieu@google.com>2017-07-08 02:04:42 +0000
committerRichard Trieu <rtrieu@google.com>2017-07-08 02:04:42 +0000
commitac6a1b6417eee05e4aa32a481b0e39a97ade501a (patch)
tree6ca0f1e32e971edce38161505fa5552d8180e79e /clang/test
parent8737f0650c050918a50504647ac02f137b3a00ad (diff)
downloadbcm5719-llvm-ac6a1b6417eee05e4aa32a481b0e39a97ade501a.tar.gz
bcm5719-llvm-ac6a1b6417eee05e4aa32a481b0e39a97ade501a.zip
[ODRHash] Support FriendDecl
llvm-svn: 307458
Diffstat (limited to 'clang/test')
-rw-r--r--clang/test/Modules/odr_hash.cpp78
1 files changed, 78 insertions, 0 deletions
diff --git a/clang/test/Modules/odr_hash.cpp b/clang/test/Modules/odr_hash.cpp
index 6e01e989a37..ee45ae52996 100644
--- a/clang/test/Modules/odr_hash.cpp
+++ b/clang/test/Modules/odr_hash.cpp
@@ -1339,6 +1339,84 @@ Bravo<char> golf;
#endif
}
+namespace Friend {
+#if defined(FIRST)
+struct T1 {};
+struct S1 {
+ friend class T1;
+};
+#elif defined(SECOND)
+struct T1 {};
+struct S1 {
+ friend T1;
+};
+#else
+S1 s1;
+// expected-error@second.h:* {{'Friend::S1' has different definitions in different modules; first difference is definition in module 'SecondModule' found friend 'Friend::T1'}}
+// expected-note@first.h:* {{but in 'FirstModule' found friend 'class T1'}}
+#endif
+
+#if defined(FIRST)
+struct T2 {};
+struct S2 {
+ friend class T2;
+};
+#elif defined(SECOND)
+struct T2 {};
+struct S2 {
+ friend struct T2;
+};
+#else
+S2 s2;
+// expected-error@second.h:* {{'Friend::S2' has different definitions in different modules; first difference is definition in module 'SecondModule' found friend 'struct T2'}}
+// expected-note@first.h:* {{but in 'FirstModule' found friend 'class T2'}}
+#endif
+
+#if defined(FIRST)
+struct T3 {};
+struct S3 {
+ friend const T3;
+};
+#elif defined(SECOND)
+struct T3 {};
+struct S3 {
+ friend T3;
+};
+#else
+S3 s3;
+// expected-error@second.h:* {{'Friend::S3' has different definitions in different modules; first difference is definition in module 'SecondModule' found friend 'Friend::T3'}}
+// expected-note@first.h:* {{but in 'FirstModule' found friend 'const Friend::T3'}}
+#endif
+
+#if defined(FIRST)
+struct T4 {};
+struct S4 {
+ friend T4;
+};
+#elif defined(SECOND)
+struct S4 {
+ friend void T4();
+};
+#else
+S4 s4;
+// expected-error@second.h:* {{'Friend::S4' has different definitions in different modules; first difference is definition in module 'SecondModule' found friend function}}
+// expected-note@first.h:* {{but in 'FirstModule' found friend class}}
+#endif
+
+#if defined(FIRST)
+struct S5 {
+ friend void T5a();
+};
+#elif defined(SECOND)
+struct S5 {
+ friend void T5b();
+};
+#else
+S5 s5;
+// expected-error@second.h:* {{'Friend::S5' has different definitions in different modules; first difference is definition in module 'SecondModule' found friend function 'T5b'}}
+// expected-note@first.h:* {{but in 'FirstModule' found friend function 'T5a'}}
+#endif
+}
// Interesting cases that should not cause errors. struct S should not error
// while struct T should error at the access specifier mismatch at the end.
namespace AllDecls {
OpenPOWER on IntegriCloud