]> granicus.if.org Git - clang/commitdiff
Promote the warning about extra qualification on a declaration from a
authorDouglas Gregor <dgregor@apple.com>
Thu, 13 Sep 2012 20:16:20 +0000 (20:16 +0000)
committerDouglas Gregor <dgregor@apple.com>
Thu, 13 Sep 2012 20:16:20 +0000 (20:16 +0000)
warning to an error. C++ bans it, and both GCC and EDG diagnose it as
an error. Microsoft allows it, so we still warn in Microsoft
mode. Fixes <rdar://problem/11135644>.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@163831 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/Basic/DiagnosticSemaKinds.td
lib/Sema/SemaDecl.cpp
test/CXX/dcl.decl/dcl.meaning/p1.cpp
test/CXX/temp/p3.cpp
test/FixIt/fixit.cpp
test/Misc/warning-flags.c
test/SemaCXX/MicrosoftExtensions.cpp
test/SemaCXX/class.cpp
test/SemaCXX/nested-name-spec.cpp

index e85f8359fe10a0f2c112551ce8250b1fbd091f57..6f813eea3e08d44598af78001ba2c945da24cc73 100644 (file)
@@ -3954,6 +3954,8 @@ def ext_out_of_line_declaration : ExtWarn<
   "out-of-line declaration of a member must be a definition">,
   InGroup<OutOfLineDeclaration>, DefaultError;
 def warn_member_extra_qualification : Warning<
+  "extra qualification on member %0">, InGroup<Microsoft>;
+def err_member_extra_qualification : Error<
   "extra qualification on member %0">;
 def err_member_qualification : Error<
   "non-friend class member %0 cannot have a qualified name">;  
index 03b33af755c0752f94201c0ad2898b8a962363cd..92780d98cdb163da4409c9b36696582519ada0de 100644 (file)
@@ -3523,7 +3523,8 @@ bool Sema::diagnoseQualifiedDeclaration(CXXScopeSpec &SS, DeclContext *DC,
   //   void X::f();
   // };
   if (Cur->Equals(DC)) {
-    Diag(Loc, diag::warn_member_extra_qualification)
+    Diag(Loc, LangOpts.MicrosoftExt? diag::warn_member_extra_qualification
+                                   : diag::err_member_extra_qualification)
       << Name << FixItHint::CreateRemoval(SS.getRange());
     SS.clear();
     return false;
index 3672ea0ea086a2f54fff2d0c84809e889ae1b59c..ec9a2611872cad5833b1e87ef616b29dda18a955 100644 (file)
@@ -7,7 +7,7 @@ namespace PR8019 {
     struct PR8019::x { int x; };  // expected-error{{non-friend class member 'x' cannot have a qualified name}}
   
     struct inner;
-    struct y::inner { }; // expected-warning{{extra qualification on member 'inner'}}
+    struct y::inner { }; // expected-error{{extra qualification on member 'inner'}}
 
     template<typename T>
     struct PR8019::x2 { }; // expected-error{{non-friend class member 'x2' cannot have a qualified name}}
@@ -16,7 +16,7 @@ namespace PR8019 {
     struct inner_template;
   
     template<typename T>
-    struct y::inner_template { }; // expected-warning{{extra qualification on member 'inner_template'}}
+    struct y::inner_template { }; // expected-error{{extra qualification on member 'inner_template'}}
   };
 
 }
@@ -29,9 +29,9 @@ namespace NS {
   template<typename T> void wibble(T);
 }
 namespace NS {
-  void NS::foo() {} // expected-warning{{extra qualification on member 'foo'}}
-  int NS::bar; // expected-warning{{extra qualification on member 'bar'}}
-  struct NS::X { }; // expected-warning{{extra qualification on member 'X'}}
-  template<typename T> struct NS::Y; // expected-warning{{extra qualification on member 'Y'}}
-  template<typename T> void NS::wibble(T) { } // expected-warning{{extra qualification on member 'wibble'}}
+  void NS::foo() {} // expected-error{{extra qualification on member 'foo'}}
+  int NS::bar; // expected-error{{extra qualification on member 'bar'}}
+  struct NS::X { }; // expected-error{{extra qualification on member 'X'}}
+  template<typename T> struct NS::Y; // expected-error{{extra qualification on member 'Y'}}
+  template<typename T> void NS::wibble(T) { } // expected-error{{extra qualification on member 'wibble'}}
 }
index c146bc4faadec8f9ff949961878e8072e098b492..11f72de918cb9557c9e31a6c4c04dcc7c9383763 100644 (file)
@@ -8,7 +8,7 @@ template<typename T> int S<T>::a, S<T>::b; // expected-error {{can only declare
 
 template<typename T> struct A { static A a; } A<T>::a; // expected-error {{expected ';' after struct}} \
                                                           expected-error {{use of undeclared identifier 'T'}} \
-                                                          expected-warning{{extra qualification}}
+                                                          expected-error{{extra qualification}}
 
 template<typename T> struct B { } f(); // expected-error {{expected ';' after struct}} \
                                           expected-error {{requires a type specifier}}
index 3eac434a36bd3502bb80b49488632151f6a2a074..dc0b6c8f2a1e624b9724de8998e49515ba54272f 100644 (file)
@@ -64,7 +64,7 @@ namespace rdar7796492 {
 
 // extra qualification on member
 class C {
-  int C::foo(); // expected-warning {{extra qualification}}
+  int C::foo(); // expected-error {{extra qualification}}
 };
 
 namespace rdar8488464 {
index 5968851d09b0f116b5ba72a5f2d95f678e0b1e1d..a1a0d7ed76a11ef2eb76689410ec7dc7353e0132 100644 (file)
@@ -18,7 +18,7 @@ This test serves two purposes:
 
 The list of warnings below should NEVER grow.  It should gradually shrink to 0.
 
-CHECK: Warnings without flags (159):
+CHECK: Warnings without flags (158):
 CHECK-NEXT:   ext_delete_void_ptr_operand
 CHECK-NEXT:   ext_enum_friend
 CHECK-NEXT:   ext_expected_semi_decl_list
@@ -101,7 +101,6 @@ CHECK-NEXT:   warn_integer_too_large_for_signed
 CHECK-NEXT:   warn_invalid_asm_cast_lvalue
 CHECK-NEXT:   warn_many_braces_around_scalar_init
 CHECK-NEXT:   warn_maynot_respond
-CHECK-NEXT:   warn_member_extra_qualification
 CHECK-NEXT:   warn_method_param_redefinition
 CHECK-NEXT:   warn_mismatched_exception_spec
 CHECK-NEXT:   warn_missing_case_for_condition
index 0b72cd3e1fc0db73d90adcdd8b4eb3b18940f0c5..9b50d3d28b256414de5b311d26385c5c553bf3fe 100644 (file)
@@ -203,3 +203,4 @@ struct PR11150 {
 
 void f() { int __except = 0; }
 
+void ::f(); // expected-warning{{extra qualification on member 'f'}}
index 4dffc8d9ecb80bfa08204b0476f85839df5d9d0f..972a79bb609005641669bc0a8200effd336b6d16 100644 (file)
@@ -120,7 +120,7 @@ struct C4 {
 struct S
 {
   void f(); // expected-note 1 {{previous declaration}}
-  void S::f() {} // expected-warning {{extra qualification on member}} expected-error {{class member cannot be redeclared}} expected-note {{previous declaration}} expected-note {{previous definition}}
+  void S::f() {} // expected-error {{extra qualification on member}} expected-error {{class member cannot be redeclared}} expected-note {{previous declaration}} expected-note {{previous definition}}
   void f() {} // expected-error {{class member cannot be redeclared}} expected-error {{redefinition}}
 };
 
index b35e38228636a8dda8ccd55101866d358726c60c..7239646d8d7e890618dc261849c2d244ce9ebb26 100644 (file)
@@ -159,7 +159,7 @@ namespace N {
   void f();
   // FIXME: if we move this to a separate definition of N, things break!
 }
-void ::global_func2(int) { } // expected-warning{{extra qualification on member 'global_func2'}}
+void ::global_func2(int) { } // expected-error{{extra qualification on member 'global_func2'}}
 
 void N::f() { } // okay
 
@@ -245,15 +245,15 @@ namespace PR7133 {
 }
 
 class CLASS {
-  void CLASS::foo2(); // expected-warning {{extra qualification on member 'foo2'}}
+  void CLASS::foo2(); // expected-error {{extra qualification on member 'foo2'}}
 };
 
 namespace PR8159 {
   class B { };
 
   class A {
-    int A::a; // expected-warning{{extra qualification on member 'a'}}
-    static int A::b; // expected-warning{{extra qualification on member 'b'}}
+    int A::a; // expected-error{{extra qualification on member 'a'}}
+    static int A::b; // expected-error{{extra qualification on member 'b'}}
     int ::c; // expected-error{{non-friend class member 'c' cannot have a qualified name}}
   };
 }