summaryrefslogtreecommitdiffstats
path: root/clang/test/SemaCXX
diff options
context:
space:
mode:
authorSerge Pavlov <sepavloff@gmail.com>2013-11-14 02:13:03 +0000
committerSerge Pavlov <sepavloff@gmail.com>2013-11-14 02:13:03 +0000
commit3cb8022849b98b1dd4c511f9fa0b92a5ef2de3e0 (patch)
treeef8d28310751dd3814e1ae14e7942db1270c7478 /clang/test/SemaCXX
parent87826253eac8f86eafe0d2bed5ccc31535dba5ed (diff)
downloadbcm5719-llvm-3cb8022849b98b1dd4c511f9fa0b92a5ef2de3e0.tar.gz
bcm5719-llvm-3cb8022849b98b1dd4c511f9fa0b92a5ef2de3e0.zip
Added warning on structures/unions that are empty or contain only
bit fields of zero size. Warnings are generated in C++ mode and if only such type is defined inside extern "C" block. The patch fixed PR5065. Differential Revision: http://llvm-reviews.chandlerc.com/D2151 llvm-svn: 194653
Diffstat (limited to 'clang/test/SemaCXX')
-rw-r--r--clang/test/SemaCXX/extern-c.cpp19
-rw-r--r--clang/test/SemaCXX/storage-class.cpp2
2 files changed, 19 insertions, 2 deletions
diff --git a/clang/test/SemaCXX/extern-c.cpp b/clang/test/SemaCXX/extern-c.cpp
index 2bf95352259..dfbf38667c5 100644
--- a/clang/test/SemaCXX/extern-c.cpp
+++ b/clang/test/SemaCXX/extern-c.cpp
@@ -140,7 +140,7 @@ namespace N2 {
// We allow all these even though the standard says they are ill-formed.
extern "C" {
- struct stat {};
+ struct stat {}; // expected-warning{{empty struct has size 0 in C, size 1 in C++}}
void stat(struct stat);
}
namespace X {
@@ -187,3 +187,20 @@ namespace X {
extern "C" double global_var_vs_extern_c_var_2; // expected-note {{here}}
}
int global_var_vs_extern_c_var_2; // expected-error {{conflicts with declaration with C language linkage}}
+
+template <class T> struct pr5065_n1 {};
+extern "C" {
+ union pr5065_1 {}; // expected-warning{{empty union has size 0 in C, size 1 in C++}}
+ struct pr5065_2 { int: 0; }; // expected-warning{{struct has size 0 in C, size 1 in C++}}
+ struct pr5065_3 {}; // expected-warning{{empty struct has size 0 in C, size 1 in C++}}
+ struct pr5065_4 { // expected-warning{{empty struct has size 0 in C, size 1 in C++}}
+ struct Inner {}; // expected-warning{{empty struct has size 0 in C, size 1 in C++}}
+ };
+ // These should not warn
+ class pr5065_n3 {};
+ pr5065_n1<int> pr5065_v;
+ struct pr5065_n4 { void m() {} };
+ struct pr5065_n5 : public pr5065_3 {};
+ struct pr5065_n6 : public virtual pr5065_3 {};
+}
+struct pr5065_n7 {};
diff --git a/clang/test/SemaCXX/storage-class.cpp b/clang/test/SemaCXX/storage-class.cpp
index 74121843e5e..decf1e7ac36 100644
--- a/clang/test/SemaCXX/storage-class.cpp
+++ b/clang/test/SemaCXX/storage-class.cpp
@@ -4,4 +4,4 @@ extern int PR6495b = 42; // expected-warning{{'extern' variable has an initializ
extern const int PR6495c[] = {42,43,44};
extern struct Test1 {}; // expected-warning {{'extern' is not permitted on a declaration of a type}}
-extern "C" struct Test0 {}; // no warning
+extern "C" struct Test0 { int x; }; // no warning
OpenPOWER on IntegriCloud