diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2CPPTests.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2CPPTests.java index 173d0267d66..d4543d13c59 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2CPPTests.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2CPPTests.java @@ -4764,12 +4764,12 @@ public class AST2CPPTests extends AST2BaseTest { } public void testBug84478_3() throws Exception { - IASTTranslationUnit tu = parse( "void foo() { switch( int x = 4 ) { case 4: break; default: break;} }", ParserLanguage.CPP ); //$NON-NLS-1$ + IASTTranslationUnit tu = parse( "void foo() { switch( int x = 4 ) { case 4: x++; break; default: break;} }", ParserLanguage.CPP ); //$NON-NLS-1$ CPPNameCollector col = new CPPNameCollector(); tu.accept( col ); - assertNoProblemBindings( col ); + assertNoProblemBindings( col ); + assertSame( col.getName(1).resolveBinding(), col.getName(2).resolveBinding() ); } - public void testBug84478_4() throws Exception { IASTTranslationUnit tu = parse( "void foo() { for( int i = 0; int j = 0; ++i) {} }", ParserLanguage.CPP ); //$NON-NLS-1$ CPPNameCollector col = new CPPNameCollector(); @@ -4777,4 +4777,34 @@ public class AST2CPPTests extends AST2BaseTest { assertNoProblemBindings( col ); } + public void testBug84478_2() throws Exception { + StringBuffer buffer = new StringBuffer(); + buffer.append("void f(){ \n"); + buffer.append(" if( int x = 1 ) x++; \n"); + buffer.append(" else x--; \n"); + buffer.append(" while( int y = 2 ) \n"); + buffer.append(" y++; \n"); + buffer.append(" for( int a = 1; int b = 2; b++){ \n"); + buffer.append(" a++; b++; \n"); + buffer.append(" } \n"); + buffer.append("} \n"); + + IASTTranslationUnit tu = parse(buffer.toString(), ParserLanguage.CPP, true, true ); + CPPNameCollector col = new CPPNameCollector(); + tu.accept( col ); + + assertNoProblemBindings( col ); + IVariable x = (IVariable) col.getName(1).resolveBinding(); + assertSame( x, col.getName(2).resolveBinding() ); + assertSame( x, col.getName(3).resolveBinding() ); + + IVariable y = (IVariable) col.getName(4).resolveBinding(); + assertSame( y, col.getName(5).resolveBinding() ); + + IVariable a = (IVariable) col.getName(6).resolveBinding(); + IVariable b = (IVariable) col.getName(7).resolveBinding(); + assertSame( b, col.getName(8).resolveBinding() ); + assertSame( a, col.getName(9).resolveBinding() ); + assertSame( b, col.getName(10).resolveBinding() ); + } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPASTIfStatement.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPASTIfStatement.java index 1ea5702a293..64504da6a7c 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPASTIfStatement.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPASTIfStatement.java @@ -12,10 +12,17 @@ package org.eclipse.cdt.core.dom.ast.cpp; import org.eclipse.cdt.core.dom.ast.IASTDeclaration; import org.eclipse.cdt.core.dom.ast.IASTIfStatement; +import org.eclipse.cdt.core.dom.ast.IScope; public interface ICPPASTIfStatement extends IASTIfStatement { public IASTDeclaration getConditionDeclaration(); public void setConditionDeclaration( IASTDeclaration d ); + /** + * Get the implicit IScope represented by this if statement + * + * @return IScope + */ + public IScope getScope(); } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPASTSwitchStatement.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPASTSwitchStatement.java index f5cbfde95f4..4ec022da34a 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPASTSwitchStatement.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPASTSwitchStatement.java @@ -13,6 +13,7 @@ package org.eclipse.cdt.core.dom.ast.cpp; import org.eclipse.cdt.core.dom.ast.ASTNodeProperty; import org.eclipse.cdt.core.dom.ast.IASTDeclaration; import org.eclipse.cdt.core.dom.ast.IASTSwitchStatement; +import org.eclipse.cdt.core.dom.ast.IScope; public interface ICPPASTSwitchStatement extends IASTSwitchStatement { @@ -38,5 +39,11 @@ public interface ICPPASTSwitchStatement extends IASTSwitchStatement { */ public void setControllerDeclaration( IASTDeclaration d ); + /** + * Get the IScope represented by this switch. + * + * @return IScope + */ + public IScope getScope(); } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPASTWhileStatement.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPASTWhileStatement.java index c231a31225e..22fd61bbe18 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPASTWhileStatement.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPASTWhileStatement.java @@ -13,6 +13,7 @@ package org.eclipse.cdt.core.dom.ast.cpp; import org.eclipse.cdt.core.dom.ast.ASTNodeProperty; import org.eclipse.cdt.core.dom.ast.IASTDeclaration; import org.eclipse.cdt.core.dom.ast.IASTWhileStatement; +import org.eclipse.cdt.core.dom.ast.IScope; /** * This inteface accommodates C++ allows for broader while loop syntax. @@ -42,4 +43,10 @@ public interface ICPPASTWhileStatement extends IASTWhileStatement { */ public void setConditionDeclaration(IASTDeclaration declaration); + /** + * Get the IScope represented by this while. + * + * @return IScope + */ + public IScope getScope(); } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTForStatement.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTForStatement.java index 1f907844ded..52c74c4d86a 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTForStatement.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTForStatement.java @@ -94,6 +94,7 @@ public class CPPASTForStatement extends CPPASTNode implements IASTForStatement, } if( init != null ) if( !init.accept( action ) ) return false; if( condition != null ) if( !condition.accept( action ) ) return false; + if( cond_declaration != null ) if( !cond_declaration.accept( action ) ) return false; if( iterationExpression != null ) if( !iterationExpression.accept( action ) ) return false; if( body != null ) if( !body.accept( action ) ) return false; return true; diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTIfStatement.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTIfStatement.java index 684b8fe001e..d3180215e17 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTIfStatement.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTIfStatement.java @@ -15,6 +15,7 @@ import org.eclipse.cdt.core.dom.ast.IASTDeclaration; import org.eclipse.cdt.core.dom.ast.IASTExpression; import org.eclipse.cdt.core.dom.ast.IASTNode; import org.eclipse.cdt.core.dom.ast.IASTStatement; +import org.eclipse.cdt.core.dom.ast.IScope; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTIfStatement; import org.eclipse.cdt.internal.core.dom.parser.IASTAmbiguityParent; @@ -26,6 +27,7 @@ public class CPPASTIfStatement extends CPPASTNode implements ICPPASTIfStatement, private IASTStatement thenClause; private IASTStatement elseClause; private IASTDeclaration condDecl; + private IScope scope; /* (non-Javadoc) * @see org.eclipse.cdt.core.dom.ast.IASTIfStatement#getCondition() @@ -113,4 +115,10 @@ public class CPPASTIfStatement extends CPPASTNode implements ICPPASTIfStatement, public void setConditionDeclaration(IASTDeclaration d) { condDecl = d; } + + public IScope getScope() { + if( scope == null ) + scope = new CPPBlockScope( this ); + return scope; + } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTSwitchStatement.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTSwitchStatement.java index 1fd4e30a66b..b877e5fb77b 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTSwitchStatement.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTSwitchStatement.java @@ -15,6 +15,7 @@ import org.eclipse.cdt.core.dom.ast.IASTDeclaration; import org.eclipse.cdt.core.dom.ast.IASTExpression; import org.eclipse.cdt.core.dom.ast.IASTNode; import org.eclipse.cdt.core.dom.ast.IASTStatement; +import org.eclipse.cdt.core.dom.ast.IScope; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTSwitchStatement; import org.eclipse.cdt.internal.core.dom.parser.IASTAmbiguityParent; @@ -24,6 +25,7 @@ import org.eclipse.cdt.internal.core.dom.parser.IASTAmbiguityParent; public class CPPASTSwitchStatement extends CPPASTNode implements ICPPASTSwitchStatement, IASTAmbiguityParent { + private IScope scope; private IASTExpression controller; private IASTStatement body; private IASTDeclaration decl; @@ -65,6 +67,7 @@ public class CPPASTSwitchStatement extends CPPASTNode implements } } if( controller != null ) if( !controller.accept( action ) ) return false; + if( decl != null ) if( !decl.accept( action ) ) return false; if( body != null ) if( !body.accept( action ) ) return false; return true; } @@ -99,4 +102,10 @@ public class CPPASTSwitchStatement extends CPPASTNode implements decl = d; } + public IScope getScope() { + if( scope == null ) + scope = new CPPBlockScope( this ); + return scope; + } + } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTWhileStatement.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTWhileStatement.java index a829c53444c..b6926dd1880 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTWhileStatement.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTWhileStatement.java @@ -15,6 +15,7 @@ import org.eclipse.cdt.core.dom.ast.IASTDeclaration; import org.eclipse.cdt.core.dom.ast.IASTExpression; import org.eclipse.cdt.core.dom.ast.IASTNode; import org.eclipse.cdt.core.dom.ast.IASTStatement; +import org.eclipse.cdt.core.dom.ast.IScope; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTWhileStatement; import org.eclipse.cdt.internal.core.dom.parser.IASTAmbiguityParent; @@ -26,6 +27,7 @@ public class CPPASTWhileStatement extends CPPASTNode implements private IASTExpression condition; private IASTStatement body; private IASTDeclaration condition2; + private IScope scope; /* (non-Javadoc) * @see org.eclipse.cdt.core.dom.ast.IASTWhileStatement#getCondition() @@ -104,4 +106,10 @@ public class CPPASTWhileStatement extends CPPASTNode implements } } + public IScope getScope() { + if( scope == null ) + scope = new CPPBlockScope( this ); + return scope; + } + } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPSemantics.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPSemantics.java index 3b9360c0a7a..02b37c53aeb 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPSemantics.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPSemantics.java @@ -29,7 +29,6 @@ import org.eclipse.cdt.core.dom.ast.IASTEnumerationSpecifier; import org.eclipse.cdt.core.dom.ast.IASTExpression; import org.eclipse.cdt.core.dom.ast.IASTExpressionList; import org.eclipse.cdt.core.dom.ast.IASTFieldReference; -import org.eclipse.cdt.core.dom.ast.IASTForStatement; import org.eclipse.cdt.core.dom.ast.IASTFunctionCallExpression; import org.eclipse.cdt.core.dom.ast.IASTFunctionDeclarator; import org.eclipse.cdt.core.dom.ast.IASTFunctionDefinition; @@ -69,7 +68,9 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTDeclSpecifier; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTElaboratedTypeSpecifier; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTExplicitTemplateInstantiation; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTFieldReference; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTForStatement; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTFunctionDeclarator; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTIfStatement; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTLinkageSpecification; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTNamedTypeSpecifier; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTNamespaceAlias; @@ -77,12 +78,14 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTNamespaceDefinition; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTNewExpression; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTOperatorName; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTQualifiedName; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTSwitchStatement; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTTemplateDeclaration; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTTemplateId; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTTemplateParameter; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTTemplateSpecialization; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTUsingDeclaration; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTUsingDirective; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTWhileStatement; import org.eclipse.cdt.core.dom.ast.cpp.ICPPBase; import org.eclipse.cdt.core.dom.ast.cpp.ICPPBasicType; import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassScope; @@ -1416,13 +1419,29 @@ public class CPPSemantics { declaration = (IASTDeclaration) node; else if( node instanceof IASTDeclarationStatement ) declaration = ((IASTDeclarationStatement)node).getDeclaration(); - else if( node instanceof IASTForStatement && checkAux ) + else if( node instanceof ICPPASTForStatement && checkAux ) { - if( ((IASTForStatement)node).getInitializerStatement() instanceof IASTDeclarationStatement ) - declaration = ((IASTDeclarationStatement)((IASTForStatement)node).getInitializerStatement()).getDeclaration(); - - } - else if( node instanceof IASTParameterDeclaration ){ + ICPPASTForStatement forStatement = (ICPPASTForStatement) node; + if( forStatement.getConditionDeclaration() == null ){ + if( forStatement.getInitializerStatement() instanceof IASTDeclarationStatement ) + declaration = ((IASTDeclarationStatement)forStatement.getInitializerStatement()).getDeclaration(); + } else { + if( forStatement.getInitializerStatement() instanceof IASTDeclarationStatement ){ + Object o = collectResult( data, scope, forStatement.getInitializerStatement(), checkAux ); + if( o instanceof IASTName ) + resultName = (IASTName) o; + else if( o instanceof IASTName[] ) + resultArray = (IASTName[]) o; + } + declaration = forStatement.getConditionDeclaration(); + } + } else if( node instanceof ICPPASTSwitchStatement ){ + declaration = ((ICPPASTSwitchStatement)node).getControllerDeclaration(); + } else if( node instanceof ICPPASTIfStatement ) { + declaration = ((ICPPASTIfStatement)node).getConditionDeclaration(); + } else if( node instanceof ICPPASTWhileStatement ){ + declaration = ((ICPPASTWhileStatement)node).getConditionDeclaration(); + } else if( node instanceof IASTParameterDeclaration ){ IASTParameterDeclaration parameterDeclaration = (IASTParameterDeclaration) node; IASTDeclarator dtor = parameterDeclaration.getDeclarator(); if (dtor != null) { // could be null when content assist in the declSpec diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPVisitor.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPVisitor.java index ee5094b9cbb..fe07a59b1b5 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPVisitor.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPVisitor.java @@ -89,6 +89,7 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTElaboratedTypeSpecifier; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTExplicitTemplateInstantiation; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTFieldReference; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTFunctionDeclarator; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTIfStatement; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTLiteralExpression; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTNamedTypeSpecifier; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTNamespaceAlias; @@ -100,6 +101,7 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTQualifiedName; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTReferenceOperator; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTSimpleDeclSpecifier; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTSimpleTypeTemplateParameter; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTSwitchStatement; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTTemplateDeclaration; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTTemplateId; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTTemplateParameter; @@ -109,6 +111,7 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTTypeIdExpression; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTTypenameExpression; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTUsingDeclaration; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTUsingDirective; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTWhileStatement; import org.eclipse.cdt.core.dom.ast.cpp.ICPPBasicType; import org.eclipse.cdt.core.dom.ast.cpp.ICPPBlockScope; import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassScope; @@ -491,13 +494,6 @@ public class CPPVisitor { } } - if( prop == IASTDeclarationStatement.DECLARATION ){ - //implicit scope, see 6.4-1 - prop = parent.getParent().getPropertyInParent(); - if( prop != IASTCompoundStatement.NESTED_STATEMENT ) - scope = null; - } - IBinding binding; try { binding = ( scope != null ) ? scope.getBinding( name, false ) : null; @@ -668,6 +664,12 @@ public class CPPVisitor { return ((IASTCompositeTypeSpecifier)parent).getScope(); } else if( parent instanceof ICPPASTNamespaceDefinition ) { return ((ICPPASTNamespaceDefinition)parent).getScope(); + } else if( parent instanceof ICPPASTSwitchStatement ){ + return ((ICPPASTSwitchStatement)parent).getScope(); + } else if( parent instanceof ICPPASTIfStatement ){ + return ((ICPPASTIfStatement)parent).getScope(); + } else if( parent instanceof ICPPASTWhileStatement ){ + return ((ICPPASTWhileStatement)parent).getScope(); } } else if( node instanceof IASTStatement ){ return getContainingScope( (IASTStatement) node ); @@ -711,6 +713,12 @@ public class CPPVisitor { IASTNode parent = node.getParent(); if( parent instanceof IASTForStatement ){ return ((IASTForStatement)parent).getScope(); + } else if( parent instanceof ICPPASTIfStatement ){ + return ((ICPPASTIfStatement)parent).getScope(); + } else if( parent instanceof ICPPASTSwitchStatement ){ + return ((ICPPASTSwitchStatement)parent).getScope(); + } else if( parent instanceof ICPPASTWhileStatement ){ + return ((ICPPASTWhileStatement)parent).getScope(); } else if( parent instanceof IASTCompoundStatement ){ return ((IASTCompoundStatement)parent).getScope(); } else if( parent instanceof ICPPASTConstructorChainInitializer ){ @@ -822,6 +830,12 @@ public class CPPVisitor { scope = compound.getScope(); } else if( parent instanceof IASTForStatement ){ scope = ((IASTForStatement)parent).getScope(); + } else if( parent instanceof ICPPASTSwitchStatement ){ + scope = ((ICPPASTSwitchStatement)parent).getScope(); + } else if( parent instanceof ICPPASTIfStatement ){ + scope = ((ICPPASTIfStatement)parent).getScope(); + } else if( parent instanceof ICPPASTWhileStatement ){ + scope = ((ICPPASTWhileStatement)parent).getScope(); } else if( parent instanceof IASTStatement ){ scope = getContainingScope( (IASTStatement)parent ); } else if( parent instanceof IASTFunctionDefinition ){ diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/GNUCPPSourceParser.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/GNUCPPSourceParser.java index e6631f06e55..c03a1f1eda3 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/GNUCPPSourceParser.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/GNUCPPSourceParser.java @@ -5219,7 +5219,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser { ICPPASTIfStatement new_if_statement = createIfStatement(); ((ASTNode) new_if_statement).setOffset(so); - if (condition != null && condition instanceof IASTExpression) // shouldn't + if (condition != null && (condition instanceof IASTExpression || condition instanceof IASTDeclaration)) // shouldn't // be // possible // but @@ -5230,8 +5230,10 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser { // it // so { - new_if_statement - .setConditionExpression((IASTExpression) condition); + if( condition instanceof IASTExpression ) + new_if_statement.setConditionExpression((IASTExpression) condition); + else if( condition instanceof IASTDeclaration ) + new_if_statement.setConditionDeclaration((IASTDeclaration) condition); condition.setParent(new_if_statement); condition.setPropertyInParent(IASTIfStatement.CONDITION); }