mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-04-23 22:52:11 +02:00
Bug 441714 - Consider spurious semicolons in CaseBreakChecker
Change-Id: Id4fe394164063007c45da37ae82cc730a9e726dd Signed-off-by: Nathan Ridge <zeratul976@hotmail.com>
This commit is contained in:
parent
155fa65c1c
commit
0221ee20b1
2 changed files with 25 additions and 0 deletions
|
@ -32,6 +32,7 @@ import org.eclipse.cdt.core.dom.ast.IASTIfStatement;
|
|||
import org.eclipse.cdt.core.dom.ast.IASTMacroExpansionLocation;
|
||||
import org.eclipse.cdt.core.dom.ast.IASTNode;
|
||||
import org.eclipse.cdt.core.dom.ast.IASTNodeLocation;
|
||||
import org.eclipse.cdt.core.dom.ast.IASTNullStatement;
|
||||
import org.eclipse.cdt.core.dom.ast.IASTReturnStatement;
|
||||
import org.eclipse.cdt.core.dom.ast.IASTStatement;
|
||||
import org.eclipse.cdt.core.dom.ast.IASTSwitchStatement;
|
||||
|
@ -90,6 +91,9 @@ public class CaseBreakChecker extends AbstractIndexAstChecker implements IChecke
|
|||
IASTStatement next = null;
|
||||
if (i < statements.length - 1)
|
||||
next = statements[i + 1];
|
||||
IASTStatement prev = null;
|
||||
if (i > 0)
|
||||
prev = statements[i - 1];
|
||||
if (isCaseStatement(curr)) {
|
||||
prevCase = curr;
|
||||
}
|
||||
|
@ -102,6 +106,13 @@ public class CaseBreakChecker extends AbstractIndexAstChecker implements IChecke
|
|||
if (!fCheckLastCase && next == null) {
|
||||
continue; // Last case and we don't care
|
||||
}
|
||||
// If this is the null statement, base the decision on the previous statement
|
||||
// instead (if there is one). Null statements can sneak in via macros in cases
|
||||
// where the macro expansion ends in a semicolon, and the macro use is followed
|
||||
// by a semicolon as well.
|
||||
if (curr instanceof IASTNullStatement && (prev != prevCase)) {
|
||||
curr = prev;
|
||||
}
|
||||
if (!isProducedByMacroExpansion(prevCase) && isFallThroughStamement(curr)) {
|
||||
IASTComment comment = null;
|
||||
if (next != null) {
|
||||
|
|
|
@ -563,4 +563,18 @@ public class CaseBreakCheckerTest extends CheckerTestCase {
|
|||
loadCodeAndRun(code);
|
||||
checkErrorLine(4, ER_ID);
|
||||
}
|
||||
|
||||
// void foo() {
|
||||
// switch (0) {
|
||||
// case 0:
|
||||
// return 42;;
|
||||
// case 1:
|
||||
// break;
|
||||
// }
|
||||
// }
|
||||
public void testDoubleSemicolon_bug441714() {
|
||||
String code = getAboveComment();
|
||||
loadCodeAndRun(code);
|
||||
checkNoErrorsOfKind(ER_ID);
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue