From 9d0a0d8e196610bb7fef57a5fa034b2f628f870f Mon Sep 17 00:00:00 2001 From: Aaron Ballman Date: Mon, 26 May 2014 17:03:54 +0000 Subject: [PATCH] Rejecting the mutable specifier on a freestanding type declaration, instead of supporting it as a "extension" (which serves no purpose). Un-XFAILing the test for mutable specifiers. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@209635 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Sema/SemaDecl.cpp | 9 +++++++-- test/CXX/dcl.dcl/dcl.spec/dcl.stc/p10.cpp | 5 ++--- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/lib/Sema/SemaDecl.cpp b/lib/Sema/SemaDecl.cpp index 3945830907..a0ce7663a8 100644 --- a/lib/Sema/SemaDecl.cpp +++ b/lib/Sema/SemaDecl.cpp @@ -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) diff --git a/test/CXX/dcl.dcl/dcl.spec/dcl.stc/p10.cpp b/test/CXX/dcl.dcl/dcl.spec/dcl.stc/p10.cpp index fd86276e85..d7e7c52f3f 100644 --- a/test/CXX/dcl.dcl/dcl.spec/dcl.stc/p10.cpp +++ b/test/CXX/dcl.dcl/dcl.spec/dcl.stc/p10.cpp @@ -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}} }; -- 2.40.0