Check that the return type for function definitions is complete.

llvm-svn: 66027
This commit is contained in:
Eli Friedman
2009-03-04 07:30:59 +00:00
parent a954a99c40
commit 9ad7244f5b
3 changed files with 12 additions and 0 deletions

View File

@@ -798,6 +798,8 @@ DIAG(err_block_return_missing_expr, ERROR,
"non-void block should return a value")
DIAG(err_block_with_return_type_requires_args, ERROR,
"block with explicit return type requires argument list")
DIAG(err_func_def_incomplete_result, ERROR,
"result type for function definition cannot be incomplete")
// Expressions.
DIAG(ext_sizeof_function_type, EXTENSION,

View File

@@ -2453,6 +2453,14 @@ Sema::DeclTy *Sema::ActOnStartOfFunctionDef(Scope *FnBodyScope, DeclTy *D) {
}
}
// The return type of a function definition must be complete
// (C99 6.9.1p3)
if (FD->getResultType()->isIncompleteType() &&
!FD->getResultType()->isVoidType()) {
Diag(FD->getLocation(), diag::err_func_def_incomplete_result) << FD;
FD->setInvalidDecl();
}
PushDeclContext(FnBodyScope, FD);
// Check the validity of our function parameters

View File

@@ -58,3 +58,5 @@ void f1static() {
static void f2static(int); // expected-error{{function declared in block scope cannot have 'static' storage class}}
register void f2register(int); // expected-error{{illegal storage class on function}}
}
struct incomplete_test a(void) {} // expected-error{{result type for function definition cannot be incomplete}}