summaryrefslogtreecommitdiffstats
path: root/clang/lib
diff options
context:
space:
mode:
authorRafael Espindola <rafael.espindola@gmail.com>2013-06-19 13:41:54 +0000
committerRafael Espindola <rafael.espindola@gmail.com>2013-06-19 13:41:54 +0000
commit45f96f87c3cf09e757048e186db4f9290f5543b4 (patch)
tree203ae6799467448f1be934413a2a1d347295fc15 /clang/lib
parentfa5026d9ebcd3ebd893b863b2ebc31378f9ef7ed (diff)
downloadbcm5719-llvm-45f96f87c3cf09e757048e186db4f9290f5543b4.tar.gz
bcm5719-llvm-45f96f87c3cf09e757048e186db4f9290f5543b4.zip
Fix pr16354.
We now reject things like struct ABC { static double a; }; register double ABC::a = 1.0; llvm-svn: 184300
Diffstat (limited to 'clang/lib')
-rw-r--r--clang/lib/Sema/SemaDecl.cpp22
1 files changed, 21 insertions, 1 deletions
diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp
index 418a70a8ba4..d9c5fe0af8a 100644
--- a/clang/lib/Sema/SemaDecl.cpp
+++ b/clang/lib/Sema/SemaDecl.cpp
@@ -4807,10 +4807,30 @@ Sema::ActOnVariableDeclarator(Scope *S, Declarator &D, DeclContext *DC,
} else {
if (DC->isRecord() && !CurContext->isRecord()) {
// This is an out-of-line definition of a static data member.
- if (SC == SC_Static) {
+ switch (SC) {
+ case SC_None:
+ break;
+ case SC_Static:
Diag(D.getDeclSpec().getStorageClassSpecLoc(),
diag::err_static_out_of_line)
<< FixItHint::CreateRemoval(D.getDeclSpec().getStorageClassSpecLoc());
+ break;
+ case SC_Auto:
+ case SC_Register:
+ case SC_Extern:
+ // [dcl.stc] p2: The auto or register specifiers shall be applied only
+ // to names of variables declared in a block or to function parameters.
+ // [dcl.stc] p6: The extern specifier cannot be used in the declaration
+ // of class members
+
+ Diag(D.getDeclSpec().getStorageClassSpecLoc(),
+ diag::err_storage_class_for_static_member)
+ << FixItHint::CreateRemoval(D.getDeclSpec().getStorageClassSpecLoc());
+ break;
+ case SC_PrivateExtern:
+ llvm_unreachable("C storage class in c++!");
+ case SC_OpenCLWorkGroupLocal:
+ llvm_unreachable("OpenCL storage class in c++!");
}
}
if (SC == SC_Static && CurContext->isRecord()) {
OpenPOWER on IntegriCloud