]> granicus.if.org Git - clang/commitdiff
Diagnose typedef of an operator name. Fixes PR7462
authorDouglas Gregor <dgregor@apple.com>
Tue, 13 Jul 2010 06:37:01 +0000 (06:37 +0000)
committerDouglas Gregor <dgregor@apple.com>
Tue, 13 Jul 2010 06:37:01 +0000 (06:37 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@108233 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/Basic/DiagnosticSemaKinds.td
lib/Sema/SemaDecl.cpp
test/SemaCXX/typedef-redecl.cpp

index abd11c74d37442e51bb16e60056958c56e916767..c56631b4dc1bb0d0aa6a2c6483987e1d998b5287 100644 (file)
@@ -225,6 +225,7 @@ def err_main_arg_wrong : Error<"%select{first|second|third|fourth}0 "
 
 /// parser diagnostics
 def ext_typedef_without_a_name : ExtWarn<"typedef requires a name">;
+def err_typedef_not_identifier : Error<"typedef name must be an identifier">;
 def err_statically_allocated_object : Error<
   "interface type cannot be statically allocated">;
 def err_object_cannot_be_passed_returned_by_value : Error<
index 7d90792376d59c2685fe3a5d6f880e9723ad3820..9c683f726af7c11366abc7a291f019628e356d7b 100644 (file)
@@ -2370,6 +2370,12 @@ Sema::ActOnTypedefDeclarator(Scope* S, Declarator& D, DeclContext* DC,
   if (D.getDeclSpec().isThreadSpecified())
     Diag(D.getDeclSpec().getThreadSpecLoc(), diag::err_invalid_thread);
 
+  if (D.getName().Kind != UnqualifiedId::IK_Identifier) {
+    Diag(D.getName().StartLocation, diag::err_typedef_not_identifier)
+      << D.getName().getSourceRange();
+    return 0;
+  }
+
   TypedefDecl *NewTD = ParseTypedefDecl(S, D, R, TInfo);
   if (!NewTD) return 0;
 
index 49e1f3aa79e549855e8b95217dc944430e75541d..7db1970a70edf40659cba5553b6d5d7fdbcd36ab 100644 (file)
@@ -48,3 +48,9 @@ namespace PR6923 {
 
   struct A;
 }
+
+namespace PR7462 {
+  struct A {};
+  typedef int operator! (A); // expected-error{{typedef name must be an identifier}}
+  int i = !A(); // expected-error{{invalid argument type}}
+}