]> granicus.if.org Git - clang/commit
Fix to PR8880 (clang dies processing a for loop)
authorSerge Pavlov <sepavloff@gmail.com>
Thu, 23 Jan 2014 15:05:00 +0000 (15:05 +0000)
committerSerge Pavlov <sepavloff@gmail.com>
Thu, 23 Jan 2014 15:05:00 +0000 (15:05 +0000)
commit2cd3061bceb9a59884ec687b715a1b04ac83f8be
treeeb686635674dd64a489d633f29c1b798e9f70d55
parentefa0a98d0d77c00993d8c36e52379def849f3ae6
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; }); )

This code is rejected by GCC if compiled in C mode but is accepted in C++
code. GCC bug 44715 tracks this discrepancy. Clang used code generation
that differs from GCC in both modes: only statement of the third
expression of 'for' behaves as if it was inside loop body.

This change makes code generation more close to GCC, considering 'break'
or 'continue' statement in condition and increment expressions of a
loop as it was inside the loop body. It also adds error for the cases
when 'break'/'continue' appear outside loop due to this syntax. If
code generation differ from GCC, warning is issued.

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

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@199897 91177308-0d34-0410-b5e6-96231b3b80d8
12 files changed:
include/clang/Basic/DiagnosticSemaKinds.td
include/clang/Sema/Scope.h
include/clang/Sema/Sema.h
lib/CodeGen/CGStmt.cpp
lib/Parse/ParseStmt.cpp
lib/Sema/Scope.cpp
lib/Sema/SemaStmt.cpp
test/Analysis/dead-stores.c
test/CodeGen/PR8880.c [new file with mode: 0644]
test/Parser/bad-control.c
test/Sema/loop-control.c [new file with mode: 0644]
test/Sema/statements.c