]> granicus.if.org Git - clang/commitdiff
Fix a nasty C99 scope issue that Neil pointed out (for ifs)
authorChris Lattner <sabre@nondot.org>
Wed, 22 Aug 2007 05:16:28 +0000 (05:16 +0000)
committerChris Lattner <sabre@nondot.org>
Wed, 22 Aug 2007 05:16:28 +0000 (05:16 +0000)
This fixes test/Parser/control-scope.c

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@41263 91177308-0d34-0410-b5e6-96231b3b80d8

Parse/ParseStmt.cpp
test/Parser/control-scope.c [new file with mode: 0644]

index 6784f166c9e3983b6f20b1587f5b20c62dfaa288..f96da44623ef07d9e77e25f7184c1e99dd1e722a 100644 (file)
@@ -433,6 +433,10 @@ Parser::StmtResult Parser::ParseIfStatement() {
     return true;
   }
   
+  // In C99, the body of the if statement is a scope, even if there is no
+  // compound stmt.
+  if (getLang().C99) EnterScope(0);
+  
   // Read the if condition.
   StmtResult CondStmt = ParseStatement();
 
@@ -440,13 +444,23 @@ Parser::StmtResult Parser::ParseIfStatement() {
   if (CondStmt.isInvalid)
     CondStmt = Actions.ParseNullStmt(Tok.getLocation());
   
+  // Pop the 'if' scope if needed.
+  if (getLang().C99) ExitScope();
   
   // If it has an else, parse it.
   SourceLocation ElseLoc;
   StmtResult ElseStmt(false);
   if (Tok.getKind() == tok::kw_else) {
     ElseLoc = ConsumeToken();
+    
+    // In C99, the body of the if statement is a scope, even if there is no
+    // compound stmt.
+    if (getLang().C99) EnterScope(0);
+    
     ElseStmt = ParseStatement();
+
+    // Pop the 'else' scope if needed.
+    if (getLang().C99) ExitScope();
     
     if (ElseStmt.isInvalid)
       ElseStmt = Actions.ParseNullStmt(ElseLoc);
diff --git a/test/Parser/control-scope.c b/test/Parser/control-scope.c
new file mode 100644 (file)
index 0000000..62f79db
--- /dev/null
@@ -0,0 +1,8 @@
+// RUN: not clang %s -std=c90
+// RUN: clang %s -std=c99
+
+int f (int z) { 
+  if (z + sizeof (enum {a})) 
+    return 1 + sizeof (enum {a}); 
+  return 0; 
+}