]> granicus.if.org Git - clang/commitdiff
C++0x's deduced auto is illegal in typedefs.
authorRichard Smith <richard-llvm@metafoo.co.uk>
Mon, 21 Feb 2011 23:18:00 +0000 (23:18 +0000)
committerRichard Smith <richard-llvm@metafoo.co.uk>
Mon, 21 Feb 2011 23:18:00 +0000 (23:18 +0000)
This actually rules out too much, since it also catches typedefs for pointers to functions with trailing return types:

  typedef auto (*F)() -> int;

Fix for that (and the same issue in all abstract-declarators) to follow shortly.

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

include/clang/Basic/DiagnosticSemaKinds.td
lib/Sema/SemaType.cpp
test/CXX/dcl.dcl/dcl.spec/dcl.type/dcl.spec.auto/p5.cpp

index fabd21b674f050a2921ca3d1be7ba21aa4b93c66..979ffb28dae5772c1d09d822c6b9b83cf67cf002 100644 (file)
@@ -898,7 +898,8 @@ def err_new_array_of_auto : Error<
 def err_auto_not_allowed : Error<
   "'auto' not allowed %select{in function prototype|in struct member"
   "|in union member|in class member|in exception declaration"
-  "|in template parameter|in block literal|in template argument|here}0">;
+  "|in template parameter|in block literal|in template argument"
+  "|in typedef|here}0">;
 def err_auto_var_requires_init : Error<
   "declaration of variable %0 with type %1 requires an initializer">;
 def err_auto_new_requires_ctor_arg : Error<
index c88baa540f5214d876d3e46b6f1b7cea9913cc6d..8051b560343e6dc9cce86e847e75530028866613 100644 (file)
@@ -1483,7 +1483,7 @@ TypeSourceInfo *Sema::GetTypeForDeclarator(Declarator &D, Scope *S,
       break;
     case Declarator::TypeNameContext:
       if (!AutoAllowedInTypeName)
-        Error = 8; // Generic
+        Error = 9; // Generic
       break;
     case Declarator::FileContext:
     case Declarator::BlockContext:
@@ -1492,6 +1492,9 @@ TypeSourceInfo *Sema::GetTypeForDeclarator(Declarator &D, Scope *S,
       break;
     }
 
+    if (D.getDeclSpec().getStorageClassSpec() == DeclSpec::SCS_typedef)
+      Error = 8;
+
     if (Error != -1) {
       Diag(D.getDeclSpec().getTypeSpecTypeLoc(), diag::err_auto_not_allowed)
         << Error;
index 836ccda6f9d726c03a2e42a00a405ed44b125fad..3724243ede0c51552649c68379052637e4d08bc2 100644 (file)
@@ -14,6 +14,9 @@ struct S {
   operator auto(); // expected-error{{'auto' not allowed here}}
 };
 
+typedef auto *AutoPtr; // expected-error{{'auto' not allowed in typedef}}
+typedef auto Fun(int a) -> decltype(a + a);
+
 void g(auto a) { // expected-error{{'auto' not allowed in function prototype}}
   try { }
   catch (auto &a) { } // expected-error{{'auto' not allowed in exception declaration}}