From 02f5fce4c90478995dcf73e767a672c781fd4916 Mon Sep 17 00:00:00 2001 From: Mike Kucera Date: Thu, 4 Jun 2009 15:56:16 +0000 Subject: [PATCH] [277458] Multi-dimensional ArrayTypes in incorrect order --- .../cdt/core/parser/tests/ast2/AST2Tests.java | 44 +++++++++++++++++++ .../internal/core/dom/parser/c/CVisitor.java | 6 +-- .../dom/parser/cpp/semantics/CPPVisitor.java | 3 +- 3 files changed, 49 insertions(+), 4 deletions(-) diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2Tests.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2Tests.java index 07d29079057..1c3bf1be1dc 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2Tests.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2Tests.java @@ -6314,4 +6314,48 @@ public class AST2Tests extends AST2BaseTest { assertTrue(t instanceof IEnumeration); } + + // /*Check that sizes are stored correctly in chains of IArrayType*/ + //int a[2][3] = {{1,2,3},{4,5,6}}; + //int b[3][2] = {{1,2},{3,4},{5,6}}; + // + public void testBug277458() throws Exception { + for(ParserLanguage lang : ParserLanguage.values()) { + IASTTranslationUnit tu = parseAndCheckBindings(getAboveComment(), lang); + assertTrue(tu.isFrozen()); + //int a[2][3] = {{1,2,3},{4,5,6}}; + { + IASTDeclaration d = tu.getDeclarations()[0]; + IBinding b = ((IASTSimpleDeclaration)d).getDeclarators()[0].getName().resolveBinding(); + IType t = ((IVariable)b).getType(); + assertTrue(t instanceof IArrayType); + IArrayType at1 = (IArrayType)t; + IASTExpression size1 = at1.getArraySizeExpression(); + assertTrue(at1.getType() instanceof IArrayType); + IArrayType at2 = (IArrayType) at1.getType(); + IASTExpression size2 = at2.getArraySizeExpression(); + assertTrue(size1 instanceof IASTLiteralExpression); + assertEquals(((IASTLiteralExpression)size1).getValue()[0], '2'); + assertTrue(size2 instanceof IASTLiteralExpression); + assertEquals(((IASTLiteralExpression)size2).getValue()[0], '3'); + } + //int b[3][2] = {{1,2},{3,4},{5,6}}; + { + IASTDeclaration d = tu.getDeclarations()[1]; + IBinding b = ((IASTSimpleDeclaration)d).getDeclarators()[0].getName().resolveBinding(); + IType t = ((IVariable)b).getType(); + assertTrue(t instanceof IArrayType); + IArrayType at1 = (IArrayType)t; + IASTExpression size1 = at1.getArraySizeExpression(); + assertTrue(at1.getType() instanceof IArrayType); + IArrayType at2 = (IArrayType) at1.getType(); + IASTExpression size2 = at2.getArraySizeExpression(); + assertTrue(size1 instanceof IASTLiteralExpression); + assertEquals(((IASTLiteralExpression)size1).getValue()[0], '3'); + assertTrue(size2 instanceof IASTLiteralExpression); + assertEquals(((IASTLiteralExpression)size2).getValue()[0], '2'); + } + } + } + } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CVisitor.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CVisitor.java index 66c7f625513..f190305a1d1 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CVisitor.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CVisitor.java @@ -1438,10 +1438,10 @@ public class CVisitor extends ASTQueries { private static IType setupArrayChain(IASTDeclarator decl, IType lastType) { if (decl instanceof IASTArrayDeclarator) { IASTArrayModifier[] mods = ((IASTArrayDeclarator)decl).getArrayModifiers(); - for (IASTArrayModifier mod : mods) { + for (int i = mods.length - 1; i >= 0; i--) { CArrayType arrayType = new CArrayType(lastType); - if (mod instanceof ICASTArrayModifier) { - arrayType.setModifier((ICASTArrayModifier)mod); + if (mods[i] instanceof ICASTArrayModifier) { + arrayType.setModifier((ICASTArrayModifier)mods[i]); } lastType= arrayType; } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPVisitor.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPVisitor.java index 93d56817d0a..18311b5f526 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPVisitor.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPVisitor.java @@ -1606,7 +1606,8 @@ public class CPPVisitor extends ASTQueries { private static IType getArrayTypes(IType type, IASTArrayDeclarator declarator) { IASTArrayModifier[] mods = declarator.getArrayModifiers(); - for (IASTArrayModifier mod : mods) { + for (int i = mods.length -1; i >= 0; i--) { + IASTArrayModifier mod = mods[i]; type = new CPPArrayType(type, mod.getConstantExpression()); } return type;