Author: rsmith Date: Thu May 5 14:16:15 2016 New Revision: 268664 URL: http://llvm.org/viewvc/llvm-project?rev=268664&view=rev Log: Add a FixItHint for the new diagnostic for a non-class-scope using-declaration that names a class-scope enumerator.
Modified: cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td cfe/trunk/lib/Sema/SemaDeclCXX.cpp cfe/trunk/test/CXX/dcl.dcl/basic.namespace/namespace.udecl/p8-cxx0x.cpp Modified: cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td?rev=268664&r1=268663&r2=268664&view=diff ============================================================================== --- cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td (original) +++ cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td Thu May 5 14:16:15 2016 @@ -393,8 +393,8 @@ def note_using_decl_constructor_ellipsis def err_using_decl_can_not_refer_to_class_member : Error< "using declaration cannot refer to class member">; def note_using_decl_class_member_workaround : Note< - "use %select{an alias declaration|a typedef declaration|a reference}0 " - "instead">; + "use %select{an alias declaration|a typedef declaration|a reference|" + "a const variable|a constexpr variable}0 instead">; def err_using_decl_can_not_refer_to_namespace : Error< "using declaration cannot refer to a namespace">; def err_using_decl_can_not_refer_to_scoped_enum : Error< Modified: cfe/trunk/lib/Sema/SemaDeclCXX.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDeclCXX.cpp?rev=268664&r1=268663&r2=268664&view=diff ============================================================================== --- cfe/trunk/lib/Sema/SemaDeclCXX.cpp (original) +++ cfe/trunk/lib/Sema/SemaDeclCXX.cpp Thu May 5 14:16:15 2016 @@ -8421,6 +8421,20 @@ bool Sema::CheckUsingDeclQualifier(Sourc Diag(UsingLoc, diag::note_using_decl_class_member_workaround) << 2 // reference declaration << FixIt; + } else if (R.getAsSingle<EnumConstantDecl>()) { + // Don't provide a fixit outside C++11 mode; we don't want to suggest + // repeating the type of the enumeration here, and we can't do so if + // the type is anonymous. + FixItHint FixIt; + if (getLangOpts().CPlusPlus11) { + // Convert 'using X::Y;' to 'auto &Y = X::Y;'. + FixIt = FixItHint::CreateReplacement( + UsingLoc, "constexpr auto " + NameInfo.getName().getAsString() + " = "); + } + + Diag(UsingLoc, diag::note_using_decl_class_member_workaround) + << (getLangOpts().CPlusPlus11 ? 4 : 3) // const[expr] variable + << FixIt; } return true; } Modified: cfe/trunk/test/CXX/dcl.dcl/basic.namespace/namespace.udecl/p8-cxx0x.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CXX/dcl.dcl/basic.namespace/namespace.udecl/p8-cxx0x.cpp?rev=268664&r1=268663&r2=268664&view=diff ============================================================================== --- cfe/trunk/test/CXX/dcl.dcl/basic.namespace/namespace.udecl/p8-cxx0x.cpp (original) +++ cfe/trunk/test/CXX/dcl.dcl/basic.namespace/namespace.udecl/p8-cxx0x.cpp Thu May 5 14:16:15 2016 @@ -7,14 +7,41 @@ struct X { int i; static int a; + enum E { e }; }; using X::i; // expected-error{{using declaration cannot refer to class member}} using X::s; // expected-error{{using declaration cannot refer to class member}} +using X::e; // expected-error{{using declaration cannot refer to class member}} +using X::E::e; // expected-error{{using declaration cannot refer to class member}} expected-warning 0-1{{C++11}} +#if __cplusplus < 201103L +// expected-note@-3 {{use a const variable}} +// expected-note@-3 {{use a const variable}} +// CXX98-NOT: fix-it:"{{.*}}":{[[@LINE-5]]: +// CXX98-NOT: fix-it:"{{.*}}":{[[@LINE-5]]: +#else +// expected-note@-8 {{use a constexpr variable}} +// expected-note@-8 {{use a constexpr variable}} +// CXX11: fix-it:"{{.*}}":{[[@LINE-10]]:1-[[@LINE-10]]:6}:"constexpr auto e = " +// CXX11: fix-it:"{{.*}}":{[[@LINE-10]]:1-[[@LINE-10]]:6}:"constexpr auto e = " +#endif void f() { using X::i; // expected-error{{using declaration cannot refer to class member}} using X::s; // expected-error{{using declaration cannot refer to class member}} + using X::e; // expected-error{{using declaration cannot refer to class member}} + using X::E::e; // expected-error{{using declaration cannot refer to class member}} expected-warning 0-1{{C++11}} +#if __cplusplus < 201103L + // expected-note@-3 {{use a const variable}} + // expected-note@-3 {{use a const variable}} + // CXX98-NOT: fix-it:"{{.*}}":{[[@LINE-5]]: + // CXX98-NOT: fix-it:"{{.*}}":{[[@LINE-5]]: +#else + // expected-note@-8 {{use a constexpr variable}} + // expected-note@-8 {{use a constexpr variable}} + // CXX11: fix-it:"{{.*}}":{[[@LINE-10]]:3-[[@LINE-10]]:8}:"constexpr auto e = " + // CXX11: fix-it:"{{.*}}":{[[@LINE-10]]:3-[[@LINE-10]]:8}:"constexpr auto e = " +#endif } template <typename T> _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits