Author: rsmith Date: Wed Nov 1 16:38:37 2017 New Revision: 317140 URL: http://llvm.org/viewvc/llvm-project?rev=317140&view=rev Log: Fix missing -Wregister warning when 'register' is applied to a function parameter.
Modified: cfe/trunk/lib/Sema/SemaDecl.cpp cfe/trunk/test/CXX/dcl.dcl/dcl.spec/dcl.stc/p2.cpp cfe/trunk/test/SemaCXX/deprecated.cpp cfe/trunk/test/SemaCXX/varargs.cpp Modified: cfe/trunk/lib/Sema/SemaDecl.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDecl.cpp?rev=317140&r1=317139&r2=317140&view=diff ============================================================================== --- cfe/trunk/lib/Sema/SemaDecl.cpp (original) +++ cfe/trunk/lib/Sema/SemaDecl.cpp Wed Nov 1 16:38:37 2017 @@ -11718,6 +11718,14 @@ Decl *Sema::ActOnParamDeclarator(Scope * StorageClass SC = SC_None; if (DS.getStorageClassSpec() == DeclSpec::SCS_register) { SC = SC_Register; + // In C++11, the 'register' storage class specifier is deprecated. + // In C++17, it is not allowed, but we tolerate it as an extension. + if (getLangOpts().CPlusPlus11) { + Diag(DS.getStorageClassSpecLoc(), + getLangOpts().CPlusPlus1z ? diag::ext_register_storage_class + : diag::warn_deprecated_register) + << FixItHint::CreateRemoval(DS.getStorageClassSpecLoc()); + } } else if (getLangOpts().CPlusPlus && DS.getStorageClassSpec() == DeclSpec::SCS_auto) { SC = SC_Auto; Modified: cfe/trunk/test/CXX/dcl.dcl/dcl.spec/dcl.stc/p2.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CXX/dcl.dcl/dcl.spec/dcl.stc/p2.cpp?rev=317140&r1=317139&r2=317140&view=diff ============================================================================== --- cfe/trunk/test/CXX/dcl.dcl/dcl.spec/dcl.stc/p2.cpp (original) +++ cfe/trunk/test/CXX/dcl.dcl/dcl.spec/dcl.stc/p2.cpp Wed Nov 1 16:38:37 2017 @@ -39,6 +39,7 @@ struct S { void foo(auto int ap, register int rp) { #if __cplusplus >= 201103L // C++11 or later // expected-warning@-2 {{'auto' storage class specifier is not permitted in C++11, and will not be supported in future releases}} +// expected-warning@-3 {{'register' storage class specifier is deprecated}} #endif auto int abo; #if __cplusplus >= 201103L // C++11 or later Modified: cfe/trunk/test/SemaCXX/deprecated.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/deprecated.cpp?rev=317140&r1=317139&r2=317140&view=diff ============================================================================== --- cfe/trunk/test/SemaCXX/deprecated.cpp (original) +++ cfe/trunk/test/SemaCXX/deprecated.cpp Wed Nov 1 16:38:37 2017 @@ -20,7 +20,12 @@ void i() throw(...); // expected-warning@-8 {{dynamic exception specifications are deprecated}} expected-note@-8 {{use 'noexcept(false)' instead}} #endif -void stuff() { +void stuff(register int q) { +#if __cplusplus > 201402L + // expected-error@-2 {{ISO C++17 does not allow 'register' storage class specifier}} +#elif __cplusplus >= 201103L && !defined(NO_DEPRECATED_FLAGS) + // expected-warning@-4 {{'register' storage class specifier is deprecated}} +#endif register int n; #if __cplusplus > 201402L // expected-error@-2 {{ISO C++17 does not allow 'register' storage class specifier}} Modified: cfe/trunk/test/SemaCXX/varargs.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/varargs.cpp?rev=317140&r1=317139&r2=317140&view=diff ============================================================================== --- cfe/trunk/test/SemaCXX/varargs.cpp (original) +++ cfe/trunk/test/SemaCXX/varargs.cpp Wed Nov 1 16:38:37 2017 @@ -8,7 +8,7 @@ void f(const string& s, ...) { // expec __builtin_va_start(ap, s); // expected-warning {{passing an object of reference type to 'va_start' has undefined behavior}} } -void g(register int i, ...) { +void g(register int i, ...) { // expected-warning 0-1{{deprecated}} __builtin_va_start(ap, i); // UB in C, OK in C++ } _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits