summaryrefslogtreecommitdiffstats
path: root/clang/test/Modules/odr_hash.cpp
diff options
context:
space:
mode:
authorRichard Trieu <rtrieu@google.com>2017-03-08 00:13:19 +0000
committerRichard Trieu <rtrieu@google.com>2017-03-08 00:13:19 +0000
commit33562c2dcc208ce8dca7a51900a856be9cf70f0b (patch)
treeac5060fb7e0b4dc782cf99983c5a0b3e1224ed9d /clang/test/Modules/odr_hash.cpp
parent1351db49b2be3a92909ced637664e08ecd035548 (diff)
downloadbcm5719-llvm-33562c2dcc208ce8dca7a51900a856be9cf70f0b.tar.gz
bcm5719-llvm-33562c2dcc208ce8dca7a51900a856be9cf70f0b.zip
[ODRHash] Hash typedefs and usings statements in classes.
llvm-svn: 297246
Diffstat (limited to 'clang/test/Modules/odr_hash.cpp')
-rw-r--r--clang/test/Modules/odr_hash.cpp105
1 files changed, 105 insertions, 0 deletions
diff --git a/clang/test/Modules/odr_hash.cpp b/clang/test/Modules/odr_hash.cpp
index 9063cd1ea76..00730a0e579 100644
--- a/clang/test/Modules/odr_hash.cpp
+++ b/clang/test/Modules/odr_hash.cpp
@@ -430,6 +430,99 @@ struct NestedNamespaceSpecifier {};
#endif
} // namespace SelfReference
+namespace TypeDef {
+#if defined(FIRST)
+struct S1 {
+ typedef int a;
+};
+#elif defined(SECOND)
+struct S1 {
+ typedef double a;
+};
+#else
+S1 s1;
+// expected-error@first.h:* {{'TypeDef::S1::a' from module 'FirstModule' is not present in definition of 'TypeDef::S1' in module 'SecondModule'}}
+// expected-note@second.h:* {{declaration of 'a' does not match}}
+#endif
+
+#if defined(FIRST)
+struct S2 {
+ typedef int a;
+};
+#elif defined(SECOND)
+struct S2 {
+ typedef int b;
+};
+#else
+S2 s2;
+// expected-error@first.h:* {{'TypeDef::S2::a' from module 'FirstModule' is not present in definition of 'TypeDef::S2' in module 'SecondModule'}}
+// expected-note@second.h:* {{definition has no member 'a'}}
+#endif
+
+#if defined(FIRST)
+typedef int T;
+struct S3 {
+ typedef T a;
+};
+#elif defined(SECOND)
+typedef double T;
+struct S3 {
+ typedef T a;
+};
+#else
+S3 s3;
+// expected-error@first.h:* {{'TypeDef::S3::a' from module 'FirstModule' is not present in definition of 'TypeDef::S3' in module 'SecondModule'}}
+// expected-note@second.h:* {{declaration of 'a' does not match}}
+#endif
+} // namespace TypeDef
+
+namespace Using {
+#if defined(FIRST)
+struct S1 {
+ using a = int;
+};
+#elif defined(SECOND)
+struct S1 {
+ using a = double;
+};
+#else
+S1 s1;
+// expected-error@first.h:* {{'Using::S1::a' from module 'FirstModule' is not present in definition of 'Using::S1' in module 'SecondModule'}}
+// expected-note@second.h:* {{declaration of 'a' does not match}}
+#endif
+
+#if defined(FIRST)
+struct S2 {
+ using a = int;
+};
+#elif defined(SECOND)
+struct S2 {
+ using b = int;
+};
+#else
+S2 s2;
+// expected-error@first.h:* {{'Using::S2::a' from module 'FirstModule' is not present in definition of 'Using::S2' in module 'SecondModule'}}
+// expected-note@second.h:* {{definition has no member 'a'}}
+#endif
+
+#if defined(FIRST)
+typedef int T;
+struct S3 {
+ using a = T;
+};
+#elif defined(SECOND)
+typedef double T;
+struct S3 {
+ using a = T;
+};
+#else
+S3 s3;
+// expected-error@first.h:* {{'Using::S3::a' from module 'FirstModule' is not present in definition of 'Using::S3' in module 'SecondModule'}}
+// expected-note@second.h:* {{declaration of 'a' does not match}}
+#endif
+} // namespace Using
+
+
// 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 {
@@ -460,6 +553,9 @@ struct S {
inline void inline_method() {}
void volatile_method() volatile {}
void const_method() const {}
+
+ typedef int typedef_int;
+ using using_int = int;
};
#elif defined(SECOND)
typedef int INT;
@@ -488,6 +584,9 @@ struct S {
inline void inline_method() {}
void volatile_method() volatile {}
void const_method() const {}
+
+ typedef int typedef_int;
+ using using_int = int;
};
#else
S *s;
@@ -521,6 +620,9 @@ struct T {
void volatile_method() volatile {}
void const_method() const {}
+ typedef int typedef_int;
+ using using_int = int;
+
private:
};
#elif defined(SECOND)
@@ -551,6 +653,9 @@ struct T {
void volatile_method() volatile {}
void const_method() const {}
+ typedef int typedef_int;
+ using using_int = int;
+
public:
};
#else
OpenPOWER on IntegriCloud