PR3062: statement expressions should be illegal at file scope. I don't

think this has any significant effects at the moment, but it could 
matter if we start constant-folding statement expressions like gcc does.

llvm-svn: 62943
This commit is contained in:
Eli Friedman 2009-01-24 23:09:00 +00:00
parent 8549e5dcc8
commit 52cc016f21
3 changed files with 9 additions and 0 deletions

View File

@ -1301,6 +1301,8 @@ DIAG(ext_typecheck_comparison_of_distinct_pointers, WARNING,
"comparison of distinct pointer types (%0 and %1)")
DIAG(err_typecheck_assign_const, ERROR,
"read-only variable is not assignable")
DIAG(err_stmtexpr_file_scope, ERROR,
"statement expression not allowed at file scope")
DIAG(err_invalid_this_use, ERROR,
"invalid use of 'this' outside of a nonstatic member function")

View File

@ -3940,6 +3940,11 @@ Sema::ExprResult Sema::ActOnStmtExpr(SourceLocation LPLoc, StmtTy *substmt,
assert(SubStmt && isa<CompoundStmt>(SubStmt) && "Invalid action invocation!");
CompoundStmt *Compound = cast<CompoundStmt>(SubStmt);
bool isFileScope = getCurFunctionOrMethodDecl() == 0;
if (isFileScope) {
return Diag(LPLoc, diag::err_stmtexpr_file_scope);
}
// FIXME: there are a variety of strange constraints to enforce here, for
// example, it is not possible to goto into a stmt expression apparently.
// More semantic analysis is needed.

View File

@ -20,3 +20,5 @@ int test5() { return ({L1: L2: L3: 5;}); }
int test6() { return ({5;}); }
void test7() { ({5;}); } // expected-warning {{expression result unused}}
// PR3062
int x[({10;})]; // expected-error {{illegal statement expression}}