From 5e359e4722aee932e301cd6daf9bb076fefb6f47 Mon Sep 17 00:00:00 2001 From: Markus Schorn Date: Fri, 4 Nov 2011 07:58:02 +0100 Subject: [PATCH] Bug 362464: Sizeof computation for plain C. --- .../cdt/core/parser/tests/ast2/AST2BaseTest.java | 9 ++++++++- .../cdt/core/parser/tests/ast2/AST2Tests.java | 13 +++++++++++++ .../core/dom/parser/ASTTranslationUnit.java | 11 +++++++++-- .../internal/core/dom/parser/SizeofCalculator.java | 3 +-- .../eclipse/cdt/internal/core/dom/parser/Value.java | 4 ++-- .../core/dom/parser/c/CASTTranslationUnit.java | 6 ++++++ .../core/dom/parser/cpp/CPPASTTranslationUnit.java | 8 +++++++- 7 files changed, 46 insertions(+), 8 deletions(-) diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2BaseTest.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2BaseTest.java index 8fe04b57bb4..7474afe408b 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2BaseTest.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2BaseTest.java @@ -100,12 +100,19 @@ public class AST2BaseTest extends BaseTestCase { protected static boolean sValidateCopy; private static final ScannerInfo GNU_SCANNER_INFO = new ScannerInfo(getGnuMap()); - private static final ScannerInfo SCANNER_INFO = new ScannerInfo(); + private static final ScannerInfo SCANNER_INFO = new ScannerInfo(getStdMap()); private static Map getGnuMap() { Map map= new HashMap(); map.put("__GNUC__", "4"); map.put("__GNUC_MINOR__", "5"); + map.put("__SIZEOF_INT__", "4"); + return map; + } + + private static Map getStdMap() { + Map map= new HashMap(); + map.put("__SIZEOF_INT__", "4"); return map; } 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 15c8403e924..63bbbfe026b 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 @@ -7342,4 +7342,17 @@ public class AST2Tests extends AST2BaseTest { es= getStatement(a, 2); assertEquals("unsigned long int", ASTTypeUtil.getType(es.getExpression().getExpressionType())); } + + // typedef int T[sizeof(int)]; + public void testSizeofExpression_Bug362464() throws Exception { + String code= getAboveComment(); + for (ParserLanguage l : ParserLanguage.values()) { + IASTTranslationUnit tu= parseAndCheckBindings(code, l); + IASTSimpleDeclaration sdecl= getDeclaration(tu, 0); + ITypedef tdef= (ITypedef) sdecl.getDeclarators()[0].getName().resolveBinding(); + IArrayType at= (IArrayType) tdef.getType(); + IValue v= at.getSize(); + assertTrue(v.numericalValue() == 4); + } + } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/ASTTranslationUnit.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/ASTTranslationUnit.java index 4a4d03ac87b..082573e68b8 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/ASTTranslationUnit.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/ASTTranslationUnit.java @@ -31,9 +31,11 @@ import org.eclipse.cdt.core.dom.ast.IASTPreprocessorMacroExpansion; import org.eclipse.cdt.core.dom.ast.IASTPreprocessorStatement; import org.eclipse.cdt.core.dom.ast.IASTProblem; import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit; +import org.eclipse.cdt.core.dom.ast.IASTTypeId; import org.eclipse.cdt.core.dom.ast.IBinding; import org.eclipse.cdt.core.dom.ast.IMacroBinding; import org.eclipse.cdt.core.dom.ast.INodeFactory; +import org.eclipse.cdt.core.dom.ast.IType; import org.eclipse.cdt.core.index.IIndex; import org.eclipse.cdt.core.index.IIndexFile; import org.eclipse.cdt.core.index.IIndexFileSet; @@ -293,7 +295,7 @@ public abstract class ASTTranslationUnit extends ASTNode implements IASTTranslat return fLocationResolver.flattenLocations(nodeLocations); } - public final IDependencyTree getDependencyTree() { + public final IDependencyTree getDependencyTree() { if (fLocationResolver == null) return null; return fLocationResolver.getDependencyTree(); @@ -414,7 +416,12 @@ public abstract class ASTTranslationUnit extends ASTNode implements IASTTranslat * Must be called by the parser, before the ast is passed to the clients. */ public abstract void resolveAmbiguities(); - + + /** + * Can be called to create a type for a type-id. + */ + abstract protected IType createType(IASTTypeId typeid); + protected void copyAbstractTU(ASTTranslationUnit copy, CopyStyle style) { copy.setIndex(fIndex); copy.fIsHeader = fIsHeader; diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/SizeofCalculator.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/SizeofCalculator.java index 2f56fb701de..8499a973a28 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/SizeofCalculator.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/SizeofCalculator.java @@ -26,7 +26,6 @@ import org.eclipse.cdt.core.dom.ast.IPointerType; import org.eclipse.cdt.core.dom.ast.IType; import org.eclipse.cdt.core.dom.ast.IValue; 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.ICPPClassType; import org.eclipse.cdt.core.dom.ast.cpp.ICPPEnumeration; import org.eclipse.cdt.core.dom.ast.cpp.ICPPMethod; @@ -111,7 +110,7 @@ public class SizeofCalculator { public SizeAndAlignment sizeAndAlignment(IType type) { type = SemanticUtil.getNestedType(type, SemanticUtil.CVTYPE | SemanticUtil.TDEF); - if (type instanceof ICPPBasicType) { + if (type instanceof IBasicType) { return sizeAndAlignment((IBasicType) type); } if (type instanceof IPointerType || type instanceof ICPPReferenceType) { diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/Value.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/Value.java index ebfb4d1c194..7fae11fec6f 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/Value.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/Value.java @@ -37,7 +37,6 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameterMap; import org.eclipse.cdt.core.parser.util.CharArrayUtils; import org.eclipse.cdt.internal.core.dom.parser.SizeofCalculator.SizeAndAlignment; import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPUnknownBinding; -import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPVisitor; import org.eclipse.cdt.internal.core.parser.scanner.ExpressionEvaluator; import org.eclipse.cdt.internal.core.parser.scanner.ExpressionEvaluator.EvalException; import org.eclipse.cdt.internal.core.pdom.db.TypeMarshalBuffer; @@ -468,8 +467,9 @@ public class Value implements IValue { IASTTypeIdExpression typeIdEx = (IASTTypeIdExpression) e; switch (typeIdEx.getOperator()) { case IASTTypeIdExpression.op_sizeof: - IType type = CPPVisitor.createType(typeIdEx.getTypeId()); + final IType type; ASTTranslationUnit ast = (ASTTranslationUnit) typeIdEx.getTranslationUnit(); + type = ast.createType(typeIdEx.getTypeId()); SizeofCalculator calculator = ast.getSizeofCalculator(); SizeAndAlignment info = calculator.sizeAndAlignment(type); if (info == null) diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CASTTranslationUnit.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CASTTranslationUnit.java index c8319e3dfe7..74b8eeb3ada 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CASTTranslationUnit.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CASTTranslationUnit.java @@ -16,6 +16,7 @@ import org.eclipse.cdt.core.dom.ILinkage; import org.eclipse.cdt.core.dom.IName; import org.eclipse.cdt.core.dom.ast.EScopeKind; import org.eclipse.cdt.core.dom.ast.IASTName; +import org.eclipse.cdt.core.dom.ast.IASTTypeId; import org.eclipse.cdt.core.dom.ast.IBinding; import org.eclipse.cdt.core.dom.ast.ICompositeType; import org.eclipse.cdt.core.dom.ast.IMacroBinding; @@ -114,4 +115,9 @@ public class CASTTranslationUnit extends ASTTranslationUnit implements IASTAmbig public IType mapToASTType(ICompositeType type) { return fStructMapper.mapToAST(type); } + + @Override + protected IType createType(IASTTypeId typeid) { + return CVisitor.createType(typeid.getAbstractDeclarator()); + } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTTranslationUnit.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTTranslationUnit.java index 2586b1f0f50..a23c8878ad0 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTTranslationUnit.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTTranslationUnit.java @@ -13,6 +13,7 @@ package org.eclipse.cdt.internal.core.dom.parser.cpp; import org.eclipse.cdt.core.dom.ILinkage; import org.eclipse.cdt.core.dom.ast.IASTName; +import org.eclipse.cdt.core.dom.ast.IASTTypeId; import org.eclipse.cdt.core.dom.ast.IBasicType; import org.eclipse.cdt.core.dom.ast.IBasicType.Kind; import org.eclipse.cdt.core.dom.ast.IBinding; @@ -58,7 +59,7 @@ public class CPPASTTranslationUnit extends ASTTranslationUnit implements ICPPAST return copy; } - public CPPNamespaceScope getScope() { + public CPPNamespaceScope getScope() { if (fScope == null) { fScope = new CPPNamespaceScope(this); addBuiltinOperators(fScope); @@ -180,4 +181,9 @@ public class CPPASTTranslationUnit extends ASTTranslationUnit implements ICPPAST public void resolveAmbiguities() { accept(new CPPASTAmbiguityResolver()); } + + @Override + protected IType createType(IASTTypeId typeid) { + return CPPVisitor.createType(typeid); + } }