]> granicus.if.org Git - clang/commitdiff
Rejecting the mutable specifier on a freestanding type declaration, instead of suppor...
authorAaron Ballman <aaron@aaronballman.com>
Mon, 26 May 2014 17:03:54 +0000 (17:03 +0000)
committerAaron Ballman <aaron@aaronballman.com>
Mon, 26 May 2014 17:03:54 +0000 (17:03 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@209635 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Sema/SemaDecl.cpp
test/CXX/dcl.dcl/dcl.spec/dcl.stc/p10.cpp

index 394583090723a111d2c3ece426167ce61c559f05..a0ce7663a8276afca257d5c9f8f8d9b4b1cd5439 100644 (file)
@@ -3344,10 +3344,15 @@ Decl *Sema::ParsedFreeStandingDeclSpec(Scope *S, AccessSpecifier AS,
   // Note that a linkage-specification sets a storage class, but
   // 'extern "C" struct foo;' is actually valid and not theoretically
   // useless.
-  if (DeclSpec::SCS SCS = DS.getStorageClassSpec())
-    if (!DS.isExternInLinkageSpec() && SCS != DeclSpec::SCS_typedef)
+  if (DeclSpec::SCS SCS = DS.getStorageClassSpec()) {
+    if (SCS == DeclSpec::SCS_mutable)
+      // Since mutable is not a viable storage class specifier in C, there is
+      // no reason to treat it as an extension. Instead, diagnose as an error.
+      Diag(DS.getStorageClassSpecLoc(), diag::err_mutable_nonmember);
+    else if (!DS.isExternInLinkageSpec() && SCS != DeclSpec::SCS_typedef)
       Diag(DS.getStorageClassSpecLoc(), DiagID)
         << DeclSpec::getSpecifierName(SCS);
+  }
 
   if (DeclSpec::TSCS TSCS = DS.getThreadStorageClassSpec())
     Diag(DS.getThreadStorageClassSpecLoc(), DiagID)
index fd86276e85488da4c73414360296f2475b6a9328..d7e7c52f3f70d60c2f82566149f80a056ad7b914 100644 (file)
@@ -1,5 +1,4 @@
-// RUN: %clang_cc1 -verify %s
-// XFAIL: *
+// RUN: %clang_cc1 -fsyntax-only -verify %s
 
 typedef const int T0;
 typedef int& T1;
@@ -9,6 +8,6 @@ struct s0 {
   mutable T0 f1; // expected-error{{'mutable' and 'const' cannot be mixed}}
   mutable int &f2; // expected-error{{'mutable' cannot be applied to references}}
   mutable T1 f3; // expected-error{{'mutable' cannot be applied to references}}
-  mutable struct s1 {}; // expected-error{{'mutable' cannot be applied to non-data members}}
+  mutable struct s1 {}; // expected-error{{'mutable' can only be applied to member variables}}
   mutable void im0(); // expected-error{{'mutable' cannot be applied to functions}}
 };