]> granicus.if.org Git - clang/commitdiff
In Objective-C, there are no trailing return types, so don't produce diagnostics...
authorRichard Smith <richard-llvm@metafoo.co.uk>
Tue, 22 Feb 2011 01:22:29 +0000 (01:22 +0000)
committerRichard Smith <richard-llvm@metafoo.co.uk>
Tue, 22 Feb 2011 01:22:29 +0000 (01:22 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@126174 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/Basic/DiagnosticSemaKinds.td
lib/Sema/SemaType.cpp
test/SemaObjC/auto-objective-c.m

index e29547c66127c7373baae1173168e04dcedd82f4..2c075cb098b50e93ebac5f6d7bbc16d6c8872957 100644 (file)
@@ -905,7 +905,7 @@ 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"
-  "|in typedef|here}0">;
+  "|in typedef|in function return type|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 9468b9c74a325598dc1355e551bbfd23a4417c62..7c96a3f2de3b2193e435bb654ec61663b28a7510 100644 (file)
@@ -1451,8 +1451,11 @@ TypeSourceInfo *Sema::GetTypeForDeclarator(Declarator &D, Scope *S,
     distributeTypeAttrsFromDeclarator(state, T);
 
   // C++0x [dcl.spec.auto]p5: reject 'auto' if it is not in an allowed context.
+  // In C++0x, a function declarator using 'auto' must have a trailing return
+  // type (this is checked later) and we can skip this. In other languages
+  // using auto, we need to check regardless.
   if (D.getDeclSpec().getTypeSpecType() == DeclSpec::TST_auto &&
-      !D.isFunctionDeclarator()) {
+      (!getLangOptions().CPlusPlus0x || !D.isFunctionDeclarator())) {
     int Error = -1;
 
     switch (D.getContext()) {
@@ -1484,7 +1487,7 @@ TypeSourceInfo *Sema::GetTypeForDeclarator(Declarator &D, Scope *S,
       break;
     case Declarator::TypeNameContext:
       if (!AutoAllowedInTypeName)
-        Error = 9; // Generic
+        Error = 10; // Generic
       break;
     case Declarator::FileContext:
     case Declarator::BlockContext:
@@ -1496,11 +1499,15 @@ TypeSourceInfo *Sema::GetTypeForDeclarator(Declarator &D, Scope *S,
     if (D.getDeclSpec().getStorageClassSpec() == DeclSpec::SCS_typedef)
       Error = 8;
 
+    // In Objective-C it is an error to use 'auto' on a function declarator.
+    if (D.isFunctionDeclarator())
+      Error = 9;
+
     // C++0x [dcl.spec.auto]p2: 'auto' is always fine if the declarator
     // contains a trailing return type. That is only legal at the outermost
     // level. Check all declarator chunks (outermost first) anyway, to give
     // better diagnostics.
-    if (Error != -1) {
+    if (getLangOptions().CPlusPlus0x && Error != -1) {
       for (unsigned i = 0, e = D.getNumTypeObjects(); i != e; ++i) {
         unsigned chunkIndex = e - i - 1;
         state.setCurrentChunkIndex(chunkIndex);
index e73f899ac6b3922bec8fac2959b2435e055c6836..e5d0179aa6c5ef2dc4cf95fc68ba96fa2efe0999 100644 (file)
@@ -7,6 +7,9 @@
 - (id) Meth;
 @end
 
+// Objective-C does not support trailing return types, so check we don't get
+// the C++ diagnostic suggesting we forgot one.
+auto noTrailingReturnType(); // expected-error {{'auto' not allowed in function return type}}
 
 typedef int (^P) (int x);