forked from OSchip/llvm-project
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:
parent
8549e5dcc8
commit
52cc016f21
|
@ -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")
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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}}
|
||||
|
|
Loading…
Reference in New Issue