diff options
| author | Rafael Espindola <rafael.espindola@gmail.com> | 2013-06-19 13:41:54 +0000 |
|---|---|---|
| committer | Rafael Espindola <rafael.espindola@gmail.com> | 2013-06-19 13:41:54 +0000 |
| commit | 45f96f87c3cf09e757048e186db4f9290f5543b4 (patch) | |
| tree | 203ae6799467448f1be934413a2a1d347295fc15 /clang/lib | |
| parent | fa5026d9ebcd3ebd893b863b2ebc31378f9ef7ed (diff) | |
| download | bcm5719-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.cpp | 22 |
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()) { |

