forked from OSchip/llvm-project
parent
747359f973
commit
ea72f449fe
|
@ -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);
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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}}
|
||||
|
Loading…
Reference in New Issue