]> granicus.if.org Git - clang/commit
Fix to PR8880 (clang dies processing a for loop).
authorSerge Pavlov <sepavloff@gmail.com>
Mon, 21 Oct 2013 09:34:44 +0000 (09:34 +0000)
committerSerge Pavlov <sepavloff@gmail.com>
Mon, 21 Oct 2013 09:34:44 +0000 (09:34 +0000)
commitfb90266d8bb5a977de45d07e702277f4cb54d74e
tree2b60de2155933f180adbfc19b625d2036bf453ff
parentd186f0b4c15d4c63e0ae7fbe6ca3207871ba2eb9
Fix to PR8880 (clang dies processing a for loop).

Due to statement expressions supported as GCC extension, it is possible
to put 'break' or 'continue' into a loop/switch statement but outside its
body, for example:

    for ( ; ({ if (first) { first = 0; continue; } 0; }); )

Such usage must be diagnosed as an error, GCC rejects it. To recognize
this and similar patterns the flags BreakScope and ContinueScope are
temporarily turned off while parsing condition expression.

Differential Revision: http://llvm-reviews.chandlerc.com/D1762

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@193073 91177308-0d34-0410-b5e6-96231b3b80d8
include/clang/Basic/DiagnosticSemaKinds.td
include/clang/Parse/Parser.h
include/clang/Sema/Scope.h
lib/Parse/ParseStmt.cpp
lib/Parse/Parser.cpp
lib/Sema/Scope.cpp
test/Analysis/dead-stores.c
test/Parser/bad-control.c
test/Sema/statements.c