Implement C99 6.7.5.3p1
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@45188 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/Sema/SemaType.cpp b/Sema/SemaType.cpp
index 8a5cfaa..fa9c9ed 100644
--- a/Sema/SemaType.cpp
+++ b/Sema/SemaType.cpp
@@ -262,6 +262,15 @@
// 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);
diff --git a/include/clang/Basic/DiagnosticKinds.def b/include/clang/Basic/DiagnosticKinds.def
index 811576e..264024b 100644
--- a/include/clang/Basic/DiagnosticKinds.def
+++ b/include/clang/Basic/DiagnosticKinds.def
@@ -644,6 +644,8 @@
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
index 0000000..d9e02ec
--- /dev/null
+++ b/test/Sema/declspec.c
@@ -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}}
+