]> granicus.if.org Git - clang/commitdiff
Implement C99 6.7.5.3p1
authorChris Lattner <sabre@nondot.org>
Wed, 19 Dec 2007 05:31:29 +0000 (05:31 +0000)
committerChris Lattner <sabre@nondot.org>
Wed, 19 Dec 2007 05:31:29 +0000 (05:31 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@45188 91177308-0d34-0410-b5e6-96231b3b80d8

Sema/SemaType.cpp
include/clang/Basic/DiagnosticKinds.def
test/Sema/declspec.c [new file with mode: 0644]

index 8a5cfaa7db3272a6eca581b8af66dc662cc173a0..fa9c9ed6811a74acd0a893498b1d20d3d7b99a9b 100644 (file)
@@ -262,6 +262,15 @@ QualType Sema::GetTypeForDeclarator(Declarator &D, Scope *S) {
       // does not have a K&R-style identifier list), then the arguments are part
       // of the type, otherwise the argument list is ().
       const DeclaratorChunk::FunctionTypeInfo &FTI = DeclType.Fun;
+        
+      // C99 6.7.5.3p1: The return type may not be a function or array type.
+      if (T->isArrayType() || T->isFunctionType()) {
+        Diag(DeclType.Loc, diag::err_func_returning_array_function,
+             T.getAsString());
+        T = Context.IntTy;
+        D.setInvalidType(true);
+      }
+        
       if (!FTI.hasPrototype) {
         // Simple void foo(), where the incoming T is the result type.
         T = Context.getFunctionTypeNoProto(T);
index 811576e9e70d6c712dfbb87801af5a19259da88e..264024b2d946dcf4061bf98a8dc03a51c0488144 100644 (file)
@@ -644,6 +644,8 @@ DIAG(warn_implicit_function_decl, WARNING,
 DIAG(ext_implicit_function_decl, EXTENSION,
      "implicit declaration of function '%0' is invalid in C99")
 
+DIAG(err_func_returning_array_function, ERROR,
+     "function cannot return array or function type '%0'")
 DIAG(err_field_declared_as_function, ERROR,
      "field '%0' declared as a function")
 DIAG(err_field_incomplete, ERROR,
diff --git a/test/Sema/declspec.c b/test/Sema/declspec.c
new file mode 100644 (file)
index 0000000..d9e02ec
--- /dev/null
@@ -0,0 +1,5 @@
+// RUN: clang %s -verify -fsyntax-only
+typedef char T[4];
+
+T foo(int n, int m) {  }  // expected-error {{cannot return array or function}}
+