Bug 485246 - Fix false positive no break at the end of the case

Change-Id: I4712dc9be3c52f3c4b2f9b79d327c43ded36967a
diff --git a/codan/org.eclipse.cdt.codan.checkers/src/org/eclipse/cdt/codan/internal/checkers/CaseBreakChecker.java b/codan/org.eclipse.cdt.codan.checkers/src/org/eclipse/cdt/codan/internal/checkers/CaseBreakChecker.java
index 57f6401..47b8157 100644
--- a/codan/org.eclipse.cdt.codan.checkers/src/org/eclipse/cdt/codan/internal/checkers/CaseBreakChecker.java
+++ b/codan/org.eclipse.cdt.codan.checkers/src/org/eclipse/cdt/codan/internal/checkers/CaseBreakChecker.java
@@ -175,34 +175,37 @@
 		 * @param body
 		 * @return
 		 */
-		public boolean isFallThroughStamement(IASTStatement body, boolean inLoop) {
+		public boolean isFallThroughStamement(IASTStatement body, boolean checkOnlyExit) {
 			if (body == null)
 				return true;
 			if (body instanceof IASTCompoundStatement) {
 				IASTStatement[] statements = ((IASTCompoundStatement) body).getStatements();
 				if (statements.length > 0) {
-					return isFallThroughStamement(statements[statements.length - 1], inLoop);
+					return isFallThroughStamement(statements[statements.length - 1], checkOnlyExit);
 				}
 				return true;
 			} else if (body instanceof IASTDoStatement) {
 				IASTDoStatement dos = (IASTDoStatement) body;
 				return isFallThroughStamement(dos.getBody(), true);
+			} else if (body instanceof IASTSwitchStatement) {
+				IASTSwitchStatement switchs = (IASTSwitchStatement) body;
+				return isFallThroughStamement(switchs.getBody(), true);
 			} else if (body instanceof IASTForStatement) {
 				IASTForStatement fors = (IASTForStatement) body;
 				return isFallThroughStamement(fors.getBody(), true);
 			} else if (body instanceof IASTWhileStatement) {
 				IASTWhileStatement whiles = (IASTWhileStatement) body;
 				return isFallThroughStamement(whiles.getBody(), true);
-			} else if (inLoop && isExitStatement(body)) {
+			} else if (checkOnlyExit && isExitStatement(body)) {
 				return false;
-			} else if (!inLoop && isBreakOrExitStatement(body)) {
+			} else if (!checkOnlyExit && isBreakOrExitStatement(body)) {
 				return false;
 			} else if (body instanceof IASTExpressionStatement) {
 				return true;
 			} else if (body instanceof IASTIfStatement) {
 				IASTIfStatement ifs = (IASTIfStatement) body;
-				return isFallThroughStamement(ifs.getThenClause(), inLoop)
-						|| isFallThroughStamement(ifs.getElseClause(), inLoop);
+				return isFallThroughStamement(ifs.getThenClause(), checkOnlyExit)
+						|| isFallThroughStamement(ifs.getElseClause(), checkOnlyExit);
 			}
 			return true; // TODO
 		}
diff --git a/codan/org.eclipse.cdt.codan.core.tests/src/org/eclipse/cdt/codan/core/internal/checkers/CaseBreakCheckerTest.java b/codan/org.eclipse.cdt.codan.core.tests/src/org/eclipse/cdt/codan/core/internal/checkers/CaseBreakCheckerTest.java
index 1bf1513..4c215f5 100644
--- a/codan/org.eclipse.cdt.codan.core.tests/src/org/eclipse/cdt/codan/core/internal/checkers/CaseBreakCheckerTest.java
+++ b/codan/org.eclipse.cdt.codan.core.tests/src/org/eclipse/cdt/codan/core/internal/checkers/CaseBreakCheckerTest.java
@@ -860,4 +860,36 @@
 		loadCodeAndRun(getAboveComment());
 		checkNoErrorsOfKind(ER_ID);
 	}
+
+	//int main() {
+	//	int a, b;
+	//
+	//	switch (a) {
+	//	case 0:
+	//		switch (b) {
+	//		default: return 1;
+	//		}
+	//	case 1:
+	//		switch (b) {
+	//		case 1: return 1;
+	//		case 2: return 1;
+	//		case 3: return 1;
+	//		}
+	//	case 2:
+	//		switch (b) {
+	//		case 1: return 1;
+	//		case 2: return 1;
+	//		case 3: return 1;
+	//		default: return 1;
+	//		}
+	//	default:
+	//		return 1;
+	//	}
+	//	return 0;
+	//}
+	public void testWithSwitchInCase_Bug485246() throws Exception {
+		loadCodeAndRun(getAboveComment());
+		checkNoErrorsOfKind(ER_ID);
+	}
+
 }