summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDouglas Gregor <dgregor@apple.com>2011-10-09 18:55:59 +0000
committerDouglas Gregor <dgregor@apple.com>2011-10-09 18:55:59 +0000
commitbb64afcc39cd0a865610306a8989332ab6e67c4a (patch)
tree529a3f6a50531bfd77ffa88082233bf60d49481c
parentc4475e8cd615995793f445286af616ba0cd6a4dd (diff)
downloadbcm5719-llvm-bb64afcc39cd0a865610306a8989332ab6e67c4a.tar.gz
bcm5719-llvm-bb64afcc39cd0a865610306a8989332ab6e67c4a.zip
Diagnose attempts to declare a non-static data member with a
non-identifier name. Fixes PR10839. llvm-svn: 141513
-rw-r--r--clang/include/clang/Basic/DiagnosticSemaKinds.td2
-rw-r--r--clang/lib/Sema/SemaDecl.cpp2
-rw-r--r--clang/lib/Sema/SemaDeclCXX.cpp8
-rw-r--r--clang/test/CXX/dcl.dcl/dcl.spec/dcl.type/p3-0x.cpp5
-rw-r--r--clang/test/SemaCXX/overloaded-operator-decl.cpp5
5 files changed, 17 insertions, 5 deletions
diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td b/clang/include/clang/Basic/DiagnosticSemaKinds.td
index 368bdc3b108..15f667f44a6 100644
--- a/clang/include/clang/Basic/DiagnosticSemaKinds.td
+++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td
@@ -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">;
diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp
index 1a80999b242..451751f1430 100644
--- a/clang/lib/Sema/SemaDecl.cpp
+++ b/clang/lib/Sema/SemaDecl.cpp
@@ -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;
}
diff --git a/clang/lib/Sema/SemaDeclCXX.cpp b/clang/lib/Sema/SemaDeclCXX.cpp
index cd57dcfb9a3..031afa078da 100644
--- a/clang/lib/Sema/SemaDeclCXX.cpp
+++ b/clang/lib/Sema/SemaDeclCXX.cpp
@@ -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.
diff --git a/clang/test/CXX/dcl.dcl/dcl.spec/dcl.type/p3-0x.cpp b/clang/test/CXX/dcl.dcl/dcl.spec/dcl.type/p3-0x.cpp
index 9a2e4ab30c4..9f88c03a624 100644
--- a/clang/test/CXX/dcl.dcl/dcl.spec/dcl.type/p3-0x.cpp
+++ b/clang/test/CXX/dcl.dcl/dcl.spec/dcl.type/p3-0x.cpp
@@ -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() {
diff --git a/clang/test/SemaCXX/overloaded-operator-decl.cpp b/clang/test/SemaCXX/overloaded-operator-decl.cpp
index 5f8655cee70..4519a2d1f9a 100644
--- a/clang/test/SemaCXX/overloaded-operator-decl.cpp
+++ b/clang/test/SemaCXX/overloaded-operator-decl.cpp
@@ -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}}
+};
OpenPOWER on IntegriCloud