1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-04-22 14:12:10 +02:00

Bug 489896 - Bogus syntax error with designated initializer.

Change-Id: Iedd4e392833471c37c8e6440553178122f499635
This commit is contained in:
Sergey Prigogin 2016-03-17 18:10:35 -07:00
parent 50ae3ff6a8
commit 483bd0e7d6
3 changed files with 56 additions and 39 deletions

View file

@ -94,14 +94,11 @@ import org.eclipse.cdt.core.dom.ast.ISemanticProblem;
import org.eclipse.cdt.core.dom.ast.IType; import org.eclipse.cdt.core.dom.ast.IType;
import org.eclipse.cdt.core.dom.ast.ITypedef; import org.eclipse.cdt.core.dom.ast.ITypedef;
import org.eclipse.cdt.core.dom.ast.IVariable; import org.eclipse.cdt.core.dom.ast.IVariable;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTArrayDesignator;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTCastExpression; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTCastExpression;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTCompositeTypeSpecifier; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTCompositeTypeSpecifier;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTCompositeTypeSpecifier.ICPPASTBaseSpecifier; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTCompositeTypeSpecifier.ICPPASTBaseSpecifier;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTConversionName; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTConversionName;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTDeleteExpression; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTDeleteExpression;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTDesignatedInitializer;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTFieldDesignator;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTFunctionCallExpression; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTFunctionCallExpression;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTFunctionDeclarator; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTFunctionDeclarator;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTFunctionDefinition; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTFunctionDefinition;
@ -140,7 +137,6 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPReferenceType;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPUsingDeclaration; import org.eclipse.cdt.core.dom.ast.cpp.ICPPUsingDeclaration;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPVariable; import org.eclipse.cdt.core.dom.ast.cpp.ICPPVariable;
import org.eclipse.cdt.core.dom.ast.cpp.SemanticQueries; import org.eclipse.cdt.core.dom.ast.cpp.SemanticQueries;
import org.eclipse.cdt.core.dom.ast.gnu.cpp.IGPPASTArrayRangeDesignator;
import org.eclipse.cdt.core.parser.IProblem; import org.eclipse.cdt.core.parser.IProblem;
import org.eclipse.cdt.core.parser.ParserLanguage; import org.eclipse.cdt.core.parser.ParserLanguage;
import org.eclipse.cdt.core.parser.util.CharArrayUtils; import org.eclipse.cdt.core.parser.util.CharArrayUtils;
@ -11742,40 +11738,48 @@ public class AST2CPPTests extends AST2TestBase {
} }
// struct S { // struct S {
// int x; // int a;
// int y; // int b;
// int z[10]; // int c[10];
// int d;
// }; // };
// S a = { .x = 10, .y = 11 }; // void test() {
// S b = { .z[4 ... 6] = 3 }; // S a = { .a = 10, .b = 11 };
// int c[6] = { [4] = 29, [2] = 15 }; // S b = { .c[4 ... 6] = 3 };
// int d[6] = { [2 ... 4] = 29 }; // S{ .d = 5 };
// int c[6] = { [4] = 29, [2] = 15 };
// int d[6] = { [2 ... 4] = 29 };
// }
public void testDesignatedInitializers() throws Exception { public void testDesignatedInitializers() throws Exception {
BindingAssertionHelper bh = getAssertionHelper(); BindingAssertionHelper bh = getAssertionHelper();
ICPPASTDesignatedInitializer d1 = bh.assertNode(".x = 10"); // ICPPASTDesignatedInitializer d1 = bh.assertNode(".a = 10");
assertEquals(1, d1.getDesignators().length); // assertEquals(1, d1.getDesignators().length);
assertTrue(d1.getDesignators()[0] instanceof ICPPASTFieldDesignator); // assertTrue(d1.getDesignators()[0] instanceof ICPPASTFieldDesignator);
ICPPASTDesignatedInitializer d2 = bh.assertNode(".y = 11"); // ICPPASTDesignatedInitializer d2 = bh.assertNode(".b = 11");
assertEquals(1, d2.getDesignators().length); // assertEquals(1, d2.getDesignators().length);
assertTrue(d2.getDesignators()[0] instanceof ICPPASTFieldDesignator); // assertTrue(d2.getDesignators()[0] instanceof ICPPASTFieldDesignator);
ICPPASTDesignatedInitializer d3 = bh.assertNode(".z[4 ... 6] = 3"); // ICPPASTDesignatedInitializer d3 = bh.assertNode(".c[4 ... 6] = 3");
assertEquals(2, d3.getDesignators().length); // assertEquals(2, d3.getDesignators().length);
assertTrue(d3.getDesignators()[0] instanceof ICPPASTFieldDesignator); // assertTrue(d3.getDesignators()[0] instanceof ICPPASTFieldDesignator);
assertTrue(d3.getDesignators()[1] instanceof IGPPASTArrayRangeDesignator); // assertTrue(d3.getDesignators()[1] instanceof IGPPASTArrayRangeDesignator);
ICPPASTDesignatedInitializer d4 = bh.assertNode("[4] = 29"); // ICPPASTDesignatedInitializer d4 = bh.assertNode(".d = 5");
assertEquals(1, d4.getDesignators().length); // assertEquals(1, d4.getDesignators().length);
assertTrue(d4.getDesignators()[0] instanceof ICPPASTArrayDesignator); // assertTrue(d4.getDesignators()[0] instanceof ICPPASTFieldDesignator);
ICPPASTDesignatedInitializer d5 = bh.assertNode("[2] = 15"); // ICPPASTDesignatedInitializer d5 = bh.assertNode("[4] = 29");
assertEquals(1, d5.getDesignators().length); // assertEquals(1, d5.getDesignators().length);
assertTrue(d5.getDesignators()[0] instanceof ICPPASTArrayDesignator); // assertTrue(d5.getDesignators()[0] instanceof ICPPASTArrayDesignator);
ICPPASTDesignatedInitializer d6 = bh.assertNode("[2 ... 4] = 29"); // ICPPASTDesignatedInitializer d6 = bh.assertNode("[2] = 15");
assertEquals(1, d6.getDesignators().length); // assertEquals(1, d6.getDesignators().length);
assertTrue(d6.getDesignators()[0] instanceof IGPPASTArrayRangeDesignator); // assertTrue(d6.getDesignators()[0] instanceof ICPPASTArrayDesignator);
ICPPField x = bh.assertNonProblemOnFirstIdentifier(".x"); // ICPPASTDesignatedInitializer d7 = bh.assertNode("[2 ... 4] = 29");
ICPPField y = bh.assertNonProblemOnFirstIdentifier(".y"); // assertEquals(1, d7.getDesignators().length);
ICPPField a = bh.assertNonProblemOnFirstIdentifier(".z[4 ... 6]"); // assertTrue(d7.getDesignators()[0] instanceof IGPPASTArrayRangeDesignator);
// ICPPField a = bh.assertNonProblemOnFirstIdentifier(".a");
// ICPPField b = bh.assertNonProblemOnFirstIdentifier(".b");
// ICPPField c = bh.assertNonProblemOnFirstIdentifier(".c[4 ... 6]");
ICPPField d = bh.assertNonProblemOnFirstIdentifier(".d");
} }
// struct A { // struct A {
// A() {} // A() {}
// }; // };

View file

@ -3864,7 +3864,8 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
* braced-init-list * braced-init-list
*/ */
@Override @Override
protected IASTInitializer optionalInitializer(IASTDeclarator dtor, DeclarationOptions option) throws EndOfFileException, BacktrackException { protected IASTInitializer optionalInitializer(IASTDeclarator dtor, DeclarationOptions option)
throws EndOfFileException, BacktrackException {
final int lt1= LTcatchEOF(1); final int lt1= LTcatchEOF(1);
// = initializer-clause // = initializer-clause
@ -3903,7 +3904,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
if (lt1 == IToken.tLPAREN) { if (lt1 == IToken.tLPAREN) {
return ctorStyleInitializer(true); return ctorStyleInitializer(true);
} }
return bracedInitList(false, false); return bracedInitList(false, true);
} }
/** /**

View file

@ -132,6 +132,7 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTQualifiedName;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTRangeBasedForStatement; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTRangeBasedForStatement;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTReferenceOperator; 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.ICPPASTSimpleDeclSpecifier;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTSimpleTypeConstructorExpression;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTSimpleTypeTemplateParameter; 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.ICPPASTSwitchStatement;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTTemplateDeclaration; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTTemplateDeclaration;
@ -1284,9 +1285,20 @@ public class CPPVisitor extends ASTQueries {
return new CPPScope.CPPScopeProblem(name, ISemanticProblem.TYPE_UNKNOWN_FOR_EXPRESSION); return new CPPScope.CPPScopeProblem(name, ISemanticProblem.TYPE_UNKNOWN_FOR_EXPRESSION);
} }
} else if (parent instanceof ICPPASTFieldDesignator) { } else if (parent instanceof ICPPASTFieldDesignator) {
ICPPASTDeclarator declarator = ASTQueries.findAncestorWithType(parent, ICPPASTDeclarator.class); IType type = null;
if (declarator != null) { IASTNode node = parent;
IType type = createType(declarator); do {
if (node instanceof ICPPASTDeclarator) {
type = createType((ICPPASTDeclarator) node);
break;
}
if (node instanceof ICPPASTSimpleTypeConstructorExpression) {
type = ((ICPPASTSimpleTypeConstructorExpression) node).getExpressionType();
break;
}
} while ((node = node.getParent()) != null);
if (type != null) {
type= getNestedType(type, TDEF | CVTYPE); type= getNestedType(type, TDEF | CVTYPE);
if (type instanceof ICPPClassType) { if (type instanceof ICPPClassType) {
type= SemanticUtil.mapToAST(type, name); type= SemanticUtil.mapToAST(type, name);