]> granicus.if.org Git - clang/commitdiff
Provide an error when a non-identifier name (such as an operator) is used as a
authorSean Hunt <scshunt@csclub.uwaterloo.ca>
Wed, 3 Nov 2010 01:07:06 +0000 (01:07 +0000)
committerSean Hunt <scshunt@csclub.uwaterloo.ca>
Wed, 3 Nov 2010 01:07:06 +0000 (01:07 +0000)
parameter name.

Fixes PR8012.

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

include/clang/Basic/DiagnosticSemaKinds.td
lib/Sema/SemaDecl.cpp
test/SemaCXX/PR8012.cpp [new file with mode: 0644]

index 2972e9b16b758850f0ece0c8758b930a6e8300c3..33b8660c1d484fbf82cf48c2d6e11a91854a3064 100644 (file)
@@ -95,6 +95,8 @@ 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">;
+def err_bad_parameter_name : Error<
+  "'%0' cannot be the name of a parameter">;
 def err_parameter_name_omitted : Error<"parameter name omitted">;
 def warn_unused_parameter : Warning<"unused parameter %0">,
   InGroup<UnusedParameter>, DefaultIgnore;
index 285173628c0597deaac0b6275d5c3f46c9323c94..10a23ec43ebe675157536e38ca2143b7f0393029 100644 (file)
@@ -4757,8 +4757,18 @@ Decl *Sema::ActOnParamDeclarator(Scope *S, Declarator &D) {
       << Context.getTypeDeclType(OwnedDecl);
   }
 
+  // Ensure we have a valid name
+  IdentifierInfo *II = 0;
+  if (D.hasName()) {
+    II = D.getIdentifier();
+    if (!II) {
+      Diag(D.getIdentifierLoc(), diag::err_bad_parameter_name)
+        << GetNameForDeclarator(D).getName().getAsString();
+      D.setInvalidType(true);
+    }
+  }
+
   // Check for redeclaration of parameters, e.g. int foo(int x, int x);
-  IdentifierInfo *II = D.getIdentifier();
   if (II) {
     LookupResult R(*this, II, D.getIdentifierLoc(), LookupOrdinaryName,
                    ForRedeclaration);
diff --git a/test/SemaCXX/PR8012.cpp b/test/SemaCXX/PR8012.cpp
new file mode 100644 (file)
index 0000000..f2f07ad
--- /dev/null
@@ -0,0 +1,3 @@
+// RUN: %clang_cc1 -fsyntax-only -verify %s -std=c++0x
+
+void foo (int operator+); // expected-error{{cannot be the name of a parameter}}