Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndrew Niefer2004-10-21 16:15:45 +0000
committerAndrew Niefer2004-10-21 16:15:45 +0000
commit8e22cf635e337c01e5837d847cd08839e5904de9 (patch)
treedeed4cc522eb141e23da0950d2ff908ed89e3195
parentbd562b731b1dd03cee8c1f7d0b9faaecbce1f0e9 (diff)
downloadorg.eclipse.cdt-8e22cf635e337c01e5837d847cd08839e5904de9.tar.gz
org.eclipse.cdt-8e22cf635e337c01e5837d847cd08839e5904de9.tar.xz
org.eclipse.cdt-8e22cf635e337c01e5837d847cd08839e5904de9.zip
fix bug 74069: [Parser][IProblem] if (…) if (…) else if (…) causes unnecessary warning marker
-rw-r--r--core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/CompleteParseASTTest.java24
-rw-r--r--core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/Parser.java86
2 files changed, 68 insertions, 42 deletions
diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/CompleteParseASTTest.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/CompleteParseASTTest.java
index a795de451f8..73f9fab6229 100644
--- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/CompleteParseASTTest.java
+++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/CompleteParseASTTest.java
@@ -2300,5 +2300,29 @@ public class CompleteParseASTTest extends CompleteParseBaseTest
assertEquals( IProblem.SYNTAX_ERROR, problem.getID() );
assertFalse( i.hasNext() );
}
+
+ public void testBug74069() throws Exception{
+ Writer writer = new StringWriter();
+ writer.write( "int f() { \n"); //$NON-NLS-1$
+ writer.write( " int a, b, c; \n"); //$NON-NLS-1$
+ writer.write( " if( a < b ) \n"); //$NON-NLS-1$
+ writer.write( " if( b < c ) \n"); //$NON-NLS-1$
+ writer.write( " return b; \n"); //$NON-NLS-1$
+ writer.write( " else if ( a < c ) \n"); //$NON-NLS-1$
+ writer.write( " return c; \n"); //$NON-NLS-1$
+ writer.write( " else \n"); //$NON-NLS-1$
+ writer.write( " return a; \n"); //$NON-NLS-1$
+ writer.write( " else if( a < c ) \n"); //$NON-NLS-1$
+ writer.write( " return a; \n"); //$NON-NLS-1$
+ writer.write( " else if( b < c ) \n"); //$NON-NLS-1$
+ writer.write( " return c; \n"); //$NON-NLS-1$
+ writer.write( " else \n"); //$NON-NLS-1$
+ writer.write( " return b; \n"); //$NON-NLS-1$
+ writer.write( "} \n"); //$NON-NLS-1$
+
+ parse( writer.toString() );
+ Iterator i = callback.getProblems();
+ assertFalse( i.hasNext() );
+ }
}
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/Parser.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/Parser.java
index c16db55cd26..9706420a05d 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/Parser.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/Parser.java
@@ -5883,48 +5883,50 @@ public class Parser implements IParserData, IParser
cleanupLastToken();
return;
case IToken.t_if :
- consume(IToken.t_if);
- consume(IToken.tLPAREN);
- IToken start = LA(1);
- boolean passedCondition = true;
- try {
- condition(scope);
- consume(IToken.tRPAREN);
- } catch (BacktrackException b) {
- //if the problem has no offset info, make a new one that does
- if( b.getProblem() != null && b.getProblem().getSourceLineNumber() == -1 ){
- IProblem p = b.getProblem();
- IProblem p2 = problemFactory.createProblem( p.getID(), start.getOffset(),
- lastToken != null ? lastToken.getEndOffset() : start.getEndOffset(),
- start.getLineNumber(), p.getOriginatingFileName(),
- p.getArguments() != null ? p.getArguments().toCharArray() : null,
- p.isWarning(), p.isError() );
- b.initialize( p2 );
- }
- failParse(b);
- failParseWithErrorHandling();
- passedCondition = false;
- }
-
- if( passedCondition ){
- if (LT(1) != IToken.tLBRACE)
- singleStatementScope(scope);
- else
- statement(scope);
- }
-
- if (LT(1) == IToken.t_else) {
- consume(IToken.t_else);
- if (LT(1) == IToken.t_if) {
- //an else if, return and get the rest of the else if as
- // the next statement instead of recursing
- cleanupLastToken();
- return;
- } else if (LT(1) != IToken.tLBRACE)
- singleStatementScope(scope);
- else
- statement(scope);
- }
+ if_loop: while( true ){
+ consume(IToken.t_if);
+ consume(IToken.tLPAREN);
+ IToken start = LA(1);
+ boolean passedCondition = true;
+ try {
+ condition(scope);
+ consume(IToken.tRPAREN);
+ } catch (BacktrackException b) {
+ //if the problem has no offset info, make a new one that does
+ if( b.getProblem() != null && b.getProblem().getSourceLineNumber() == -1 ){
+ IProblem p = b.getProblem();
+ IProblem p2 = problemFactory.createProblem( p.getID(), start.getOffset(),
+ lastToken != null ? lastToken.getEndOffset() : start.getEndOffset(),
+ start.getLineNumber(), p.getOriginatingFileName(),
+ p.getArguments() != null ? p.getArguments().toCharArray() : null,
+ p.isWarning(), p.isError() );
+ b.initialize( p2 );
+ }
+ failParse(b);
+ failParseWithErrorHandling();
+ passedCondition = false;
+ }
+
+ if( passedCondition ){
+ if (LT(1) != IToken.tLBRACE)
+ singleStatementScope(scope);
+ else
+ statement(scope);
+ }
+
+ if (LT(1) == IToken.t_else) {
+ consume(IToken.t_else);
+ if (LT(1) == IToken.t_if) {
+ //an else if, don't recurse, just loop and do another if
+ cleanupLastToken();
+ continue if_loop;
+ } else if (LT(1) != IToken.tLBRACE)
+ singleStatementScope(scope);
+ else
+ statement(scope);
+ }
+ break if_loop;
+ }
cleanupLastToken();
return;
case IToken.t_switch :

Back to the top