[cfe-commits] r41471 - in /cfe/trunk: Parse/ParseStmt.cpp test/Parser/if-scope-c90.c test/Parser/if-scope-c99.c
Chris Lattner
sabre at nondot.org
Sun Aug 26 16:08:06 PDT 2007
Author: lattner
Date: Sun Aug 26 18:08:06 2007
New Revision: 41471
URL: http://llvm.org/viewvc/llvm-project?rev=41471&view=rev
Log:
Fix test/Parser/if-scope-*.c. Patch by Neil Booth!
Added:
cfe/trunk/test/Parser/if-scope-c90.c
cfe/trunk/test/Parser/if-scope-c99.c
Modified:
cfe/trunk/Parse/ParseStmt.cpp
Modified: cfe/trunk/Parse/ParseStmt.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/Parse/ParseStmt.cpp?rev=41471&r1=41470&r2=41471&view=diff
==============================================================================
--- cfe/trunk/Parse/ParseStmt.cpp (original)
+++ cfe/trunk/Parse/ParseStmt.cpp Sun Aug 26 18:08:06 2007
@@ -427,10 +427,17 @@
return true;
}
+ // C99 6.8.4p3 - In C99, the if statement is a block. This is not
+ // the case for C90.
+ if (getLang().C99)
+ EnterScope(Scope::DeclScope);
+
// Parse the condition.
ExprResult CondExp = ParseSimpleParenExpression();
if (CondExp.isInvalid) {
SkipUntil(tok::semi);
+ if (getLang().C99)
+ ExitScope();
return true;
}
@@ -472,6 +479,9 @@
ElseStmt = Actions.ParseNullStmt(ElseLoc);
}
+ if (getLang().C99)
+ ExitScope();
+
return Actions.ParseIfStmt(IfLoc, CondExp.Val, CondStmt.Val,
ElseLoc, ElseStmt.Val);
}
@@ -488,9 +498,13 @@
SkipUntil(tok::semi);
return true;
}
-
- // Start the switch scope.
- EnterScope(Scope::BreakScope|Scope::DeclScope);
+
+ // C99 6.8.4p3 - In C99, the switch statement is a block. This is
+ // not the case for C90. Start the switch scope.
+ if (getLang().C99)
+ EnterScope(Scope::BreakScope|Scope::DeclScope);
+ else
+ EnterScope(Scope::BreakScope);
// Parse the condition.
ExprResult Cond = ParseSimpleParenExpression();
@@ -538,8 +552,12 @@
return true;
}
- // Start the loop scope.
- EnterScope(Scope::BreakScope | Scope::ContinueScope | Scope::DeclScope);
+ // C99 6.8.5p5 - In C99, the while statement is a block. This is not
+ // the case for C90. Start the loop scope.
+ if (getLang().C99)
+ EnterScope(Scope::BreakScope | Scope::ContinueScope | Scope::DeclScope);
+ else
+ EnterScope(Scope::BreakScope | Scope::ContinueScope);
// Parse the condition.
ExprResult Cond = ParseSimpleParenExpression();
@@ -571,8 +589,12 @@
assert(Tok.getKind() == tok::kw_do && "Not a do stmt!");
SourceLocation DoLoc = ConsumeToken(); // eat the 'do'.
- // Start the loop scope.
- EnterScope(Scope::BreakScope | Scope::ContinueScope | Scope::DeclScope);
+ // C99 6.8.5p5 - In C99, the do statement is a block. This is not
+ // the case for C90. Start the loop scope.
+ if (getLang().C99)
+ EnterScope(Scope::BreakScope | Scope::ContinueScope | Scope::DeclScope);
+ else
+ EnterScope(Scope::BreakScope | Scope::ContinueScope);
// C99 6.8.5p5 - In C99, the body of the if statement is a scope, even if
// there is no compound stmt. C90 does not have this clause. We only do this
@@ -626,7 +648,12 @@
return true;
}
- EnterScope(Scope::BreakScope | Scope::ContinueScope | Scope::DeclScope);
+ // C99 6.8.5p5 - In C99, the for statement is a block. This is not
+ // the case for C90. Start the loop scope.
+ if (getLang().C99)
+ EnterScope(Scope::BreakScope | Scope::ContinueScope | Scope::DeclScope);
+ else
+ EnterScope(Scope::BreakScope | Scope::ContinueScope);
SourceLocation LParenLoc = ConsumeParen();
ExprResult Value;
Added: cfe/trunk/test/Parser/if-scope-c90.c
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Parser/if-scope-c90.c?rev=41471&view=auto
==============================================================================
--- cfe/trunk/test/Parser/if-scope-c90.c (added)
+++ cfe/trunk/test/Parser/if-scope-c90.c Sun Aug 26 18:08:06 2007
@@ -0,0 +1,8 @@
+// RUN: clang -parse-ast-check --std=c90 %s
+
+int f (int z)
+{
+ if (z > sizeof (enum {a, b}))
+ return a;
+ return b;
+}
Added: cfe/trunk/test/Parser/if-scope-c99.c
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Parser/if-scope-c99.c?rev=41471&view=auto
==============================================================================
--- cfe/trunk/test/Parser/if-scope-c99.c (added)
+++ cfe/trunk/test/Parser/if-scope-c99.c Sun Aug 26 18:08:06 2007
@@ -0,0 +1,8 @@
+// RUN: clang -parse-ast-check --std=c99 %s
+
+int f (int z)
+{
+ if (z > sizeof (enum {a, b}))
+ return a;
+ return b; // expected-error{{use of undeclared identifier}}
+}
More information about the cfe-commits
mailing list