]> granicus.if.org Git - clang/commitdiff
Diagnose attempts to declare a non-static data member with a
authorDouglas Gregor <dgregor@apple.com>
Sun, 9 Oct 2011 18:55:59 +0000 (18:55 +0000)
committerDouglas Gregor <dgregor@apple.com>
Sun, 9 Oct 2011 18:55:59 +0000 (18:55 +0000)
non-identifier name. Fixes PR10839.

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

include/clang/Basic/DiagnosticSemaKinds.td
lib/Sema/SemaDecl.cpp
lib/Sema/SemaDeclCXX.cpp
test/CXX/dcl.dcl/dcl.spec/dcl.type/p3-0x.cpp
test/SemaCXX/overloaded-operator-decl.cpp

index 368bdc3b108be655b761901f0a94471ab838d1d4..15f667f44a60b135ee2b6df639e15a23744ea6d2 100644 (file)
@@ -103,7 +103,7 @@ def ext_flexible_array_init : Extension<
 def ext_anon_param_requires_type_specifier : Extension<
   "type specifier required for unnamed parameter, defaults to int">;
 def err_bad_variable_name : Error<
-  "'%0' cannot be the name of a variable or data member">;
+  "%0 cannot be the name of a variable or data member">;
 def err_bad_parameter_name : Error<
   "'%0' cannot be the name of a parameter">;
 def err_parameter_name_omitted : Error<"parameter name omitted">;
index 1a80999b242fff0752390d4ad5606990040bf517..451751f14308849d82f7602eba28d2eb1f1c23ff 100644 (file)
@@ -3720,7 +3720,7 @@ Sema::ActOnVariableDeclarator(Scope *S, Declarator &D, DeclContext *DC,
   IdentifierInfo *II = Name.getAsIdentifierInfo();
   if (!II) {
     Diag(D.getIdentifierLoc(), diag::err_bad_variable_name)
-      << Name.getAsString();
+      << Name;
     return 0;
   }
 
index cd57dcfb9a3a6fe494713239fd4f58d6a25bb072..031afa078dac57f0461409ca253e5666527c6658 100644 (file)
@@ -1487,8 +1487,14 @@ Sema::ActOnCXXMemberDeclarator(Scope *S, AccessSpecifier AS, Declarator &D,
   Decl *Member;
   if (isInstField) {
     CXXScopeSpec &SS = D.getCXXScopeSpec();
+
+    // Data members must have identifiers for names.
+    if (Name.getNameKind() != DeclarationName::Identifier) {
+      Diag(Loc, diag::err_bad_variable_name)
+        << Name;
+      return 0;
+    }
     
-    // FIXME: Check that the name is an identifier!
     IdentifierInfo *II = Name.getAsIdentifierInfo();
 
     // Member field could not be with "template" keyword.
index 9a2e4ab30c445cc12b9f2a66edf1a7289d00d805..9f88c03a624c7733047e498e27c78d5b5be54a01 100644 (file)
@@ -7,8 +7,9 @@ template<typename T> using Y = struct { // expected-error {{can not be defined i
 
 class K {
   virtual ~K();
-  // FIXME: the diagnostic here is really bad
-  operator struct S {} (); // expected-error 2{{}} expected-note {{}}
+  // FIXME: Diagnostic could use some work
+  operator struct S {} (); // expected-error{{ 'operator S' cannot be the name of a variable or data member}} \
+  // expected-error{{expected ';' at end of declaration list}}
 };
 
 void f() {
index 5f8655cee70cb61c2c5344ab61b5e520163928e7..4519a2d1f9adfa60c8062d32f67557b21e5d62ca 100644 (file)
@@ -43,3 +43,8 @@ namespace PR6238 {
     void operator()();
   } plus;
 }
+
+struct PR10839 {
+  operator int; // expected-error{{'operator int' cannot be the name of a variable or data member}}
+  int operator+; // expected-error{{'operator+' cannot be the name of a variable or data member}}
+};