aboutsummaryrefslogtreecommitdiff
path: root/lib/Sema/SemaStmt.cpp
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2009-03-04 04:23:07 +0000
committerChris Lattner <sabre@nondot.org>2009-03-04 04:23:07 +0000
commit24e1e707b4c362f18e371e2bbf054a8345b57bfa (patch)
tree5489d474d54bca3e549a637ddb1230a0097cf9f2 /lib/Sema/SemaStmt.cpp
parent074dda6d81315d3e1414ce018325c166bcb02028 (diff)
Change Parser::ParseCaseStatement to use an iterative approach to parsing
multiple sequential case statements instead of doing it with recursion. This fixes a problem where we run out of stack space parsing 100K directly nested cases. There are a couple other problems that prevent this from being useful in practice (right now the example only parses correctly with -disable-free and doesn't work with -emit-llvm), but this is a start. I'm not including a testcase because it is large and uninteresting for regtesting. Sebastian, I would appreciate it if you could scrutinize the smart pointer gymnastics I do. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@66011 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Sema/SemaStmt.cpp')
-rw-r--r--lib/Sema/SemaStmt.cpp24
1 files changed, 14 insertions, 10 deletions
diff --git a/lib/Sema/SemaStmt.cpp b/lib/Sema/SemaStmt.cpp
index ea9ba4c393..fcc501c45d 100644
--- a/lib/Sema/SemaStmt.cpp
+++ b/lib/Sema/SemaStmt.cpp
@@ -61,10 +61,9 @@ Sema::OwningStmtResult Sema::ActOnDeclStmt(DeclTy *decl,
DeclGroupRef DG(*decls.begin());
return Owned(new (Context) DeclStmt(DG, StartLoc, EndLoc));
}
- else {
- DeclGroupRef DG(DeclGroup::Create(Context, decls.size(), &decls[0]));
- return Owned(new (Context) DeclStmt(DG, StartLoc, EndLoc));
- }
+
+ DeclGroupRef DG(DeclGroup::Create(Context, decls.size(), &decls[0]));
+ return Owned(new (Context) DeclStmt(DG, StartLoc, EndLoc));
}
Action::OwningStmtResult
@@ -114,16 +113,14 @@ Sema::ActOnCompoundStmt(SourceLocation L, SourceLocation R,
Action::OwningStmtResult
Sema::ActOnCaseStmt(SourceLocation CaseLoc, ExprArg lhsval,
SourceLocation DotDotDotLoc, ExprArg rhsval,
- SourceLocation ColonLoc, StmtArg subStmt) {
- Stmt *SubStmt = static_cast<Stmt*>(subStmt.release());
+ SourceLocation ColonLoc) {
assert((lhsval.get() != 0) && "missing expression in case statement");
// C99 6.8.4.2p3: The expression shall be an integer constant.
// However, GCC allows any evaluatable integer expression.
-
Expr *LHSVal = static_cast<Expr*>(lhsval.get());
if (VerifyIntegerConstantExpression(LHSVal))
- return Owned(SubStmt);
+ return StmtError();
// GCC extension: The expression shall be an integer constant.
@@ -135,17 +132,24 @@ Sema::ActOnCaseStmt(SourceLocation CaseLoc, ExprArg lhsval,
if (SwitchStack.empty()) {
Diag(CaseLoc, diag::err_case_not_in_switch);
- return Owned(SubStmt);
+ return StmtError();
}
// Only now release the smart pointers.
lhsval.release();
rhsval.release();
- CaseStmt *CS = new (Context) CaseStmt(LHSVal, RHSVal, SubStmt, CaseLoc);
+ CaseStmt *CS = new (Context) CaseStmt(LHSVal, RHSVal, CaseLoc);
SwitchStack.back()->addSwitchCase(CS);
return Owned(CS);
}
+/// ActOnCaseStmtBody - This installs a statement as the body of a case.
+void Sema::ActOnCaseStmtBody(StmtTy *caseStmt, StmtArg subStmt) {
+ CaseStmt *CS = static_cast<CaseStmt*>(caseStmt);
+ Stmt *SubStmt = static_cast<Stmt*>(subStmt.release());
+ CS->setSubStmt(SubStmt);
+}
+
Action::OwningStmtResult
Sema::ActOnDefaultStmt(SourceLocation DefaultLoc, SourceLocation ColonLoc,
StmtArg subStmt, Scope *CurScope) {