diff options
| author | Alexis Hunt <alercah@gmail.com> | 2010-11-03 01:07:06 +0000 |
|---|---|---|
| committer | Alexis Hunt <alercah@gmail.com> | 2010-11-03 01:07:06 +0000 |
| commit | a56cbccfc4134e3678563f64cdf8ad6b32f3d941 (patch) | |
| tree | d1d9396f06cee232811e125c58e0f592913d7cea /clang | |
| parent | c6af2b40669e2231bf996c09c54ca1bbb656e1a4 (diff) | |
| download | bcm5719-llvm-a56cbccfc4134e3678563f64cdf8ad6b32f3d941.tar.gz bcm5719-llvm-a56cbccfc4134e3678563f64cdf8ad6b32f3d941.zip | |
Provide an error when a non-identifier name (such as an operator) is used as a
parameter name.
Fixes PR8012.
llvm-svn: 118138
Diffstat (limited to 'clang')
| -rw-r--r-- | clang/include/clang/Basic/DiagnosticSemaKinds.td | 2 | ||||
| -rw-r--r-- | clang/lib/Sema/SemaDecl.cpp | 12 | ||||
| -rw-r--r-- | clang/test/SemaCXX/PR8012.cpp | 3 |
3 files changed, 16 insertions, 1 deletions
diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td b/clang/include/clang/Basic/DiagnosticSemaKinds.td index 2972e9b16b7..33b8660c1d4 100644 --- a/clang/include/clang/Basic/DiagnosticSemaKinds.td +++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td @@ -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; diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp index 285173628c0..10a23ec43eb 100644 --- a/clang/lib/Sema/SemaDecl.cpp +++ b/clang/lib/Sema/SemaDecl.cpp @@ -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/clang/test/SemaCXX/PR8012.cpp b/clang/test/SemaCXX/PR8012.cpp new file mode 100644 index 00000000000..f2f07ad3640 --- /dev/null +++ b/clang/test/SemaCXX/PR8012.cpp @@ -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}} |

