diff --git a/core/org.eclipse.cdt.core.tests/META-INF/MANIFEST.MF b/core/org.eclipse.cdt.core.tests/META-INF/MANIFEST.MF index aea4f6ca92c..7fc5f9615b5 100644 --- a/core/org.eclipse.cdt.core.tests/META-INF/MANIFEST.MF +++ b/core/org.eclipse.cdt.core.tests/META-INF/MANIFEST.MF @@ -2,7 +2,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: org.eclipse.cdt.core.tests Bundle-SymbolicName: org.eclipse.cdt.core.tests; singleton:=true -Bundle-Version: 5.1.0.qualifier +Bundle-Version: 5.3.0.qualifier Bundle-Activator: org.eclipse.cdt.core.testplugin.CTestPlugin Export-Package: org.eclipse.cdt.core.cdescriptor.tests, org.eclipse.cdt.core.internal.errorparsers.tests;x-internal:=true, 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 458a9e4728f..08c60d43fe7 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 @@ -7271,4 +7271,25 @@ public class AST2Tests extends AST2BaseTest { assertEquals(2, decls.length); } } + + // typedef __typeof__((int*)0-(int*)0) ptrdiff_t; + // typedef __typeof__(sizeof(int)) size_t; + public void testPtrDiffRecursion_317004() throws Exception { + final String comment = getAboveComment(); + String code= comment; + parseAndCheckBindings(code, ParserLanguage.C, true); + BindingAssertionHelper bh= new BindingAssertionHelper(code, false); + ITypedef td= bh.assertNonProblem("ptrdiff_t", 0); + assertEquals("int", ASTTypeUtil.getType(td.getType())); + td= bh.assertNonProblem("size_t", 0); + assertEquals("unsigned long int", ASTTypeUtil.getType(td.getType())); + + code= "namespace std {" + comment + "}"; + parseAndCheckBindings(code, ParserLanguage.CPP, true); + bh= new BindingAssertionHelper(code, true); + td= bh.assertNonProblem("ptrdiff_t", 0); + assertEquals("int", ASTTypeUtil.getType(td.getType())); + td= bh.assertNonProblem("size_t", 0); + assertEquals("unsigned long int", ASTTypeUtil.getType(td.getType())); + } } 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 2e78f81f1e0..f9ad8d19bdd 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 @@ -29,6 +29,7 @@ import org.eclipse.cdt.core.dom.ast.IASTDeclarationStatement; import org.eclipse.cdt.core.dom.ast.IASTDeclarator; import org.eclipse.cdt.core.dom.ast.IASTElaboratedTypeSpecifier; import org.eclipse.cdt.core.dom.ast.IASTEnumerationSpecifier; +import org.eclipse.cdt.core.dom.ast.IASTEnumerationSpecifier.IASTEnumerator; import org.eclipse.cdt.core.dom.ast.IASTExpression; import org.eclipse.cdt.core.dom.ast.IASTFieldReference; import org.eclipse.cdt.core.dom.ast.IASTForStatement; @@ -53,6 +54,7 @@ import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit; import org.eclipse.cdt.core.dom.ast.IASTTypeId; import org.eclipse.cdt.core.dom.ast.IArrayType; 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; import org.eclipse.cdt.core.dom.ast.ICompositeType; import org.eclipse.cdt.core.dom.ast.IEnumeration; @@ -67,8 +69,6 @@ import org.eclipse.cdt.core.dom.ast.IScope; import org.eclipse.cdt.core.dom.ast.IType; import org.eclipse.cdt.core.dom.ast.ITypedef; import org.eclipse.cdt.core.dom.ast.IVariable; -import org.eclipse.cdt.core.dom.ast.IASTEnumerationSpecifier.IASTEnumerator; -import org.eclipse.cdt.core.dom.ast.IBasicType.Kind; import org.eclipse.cdt.core.dom.ast.c.CASTVisitor; import org.eclipse.cdt.core.dom.ast.c.ICASTArrayModifier; import org.eclipse.cdt.core.dom.ast.c.ICASTCompositeTypeSpecifier; @@ -638,28 +638,31 @@ public class CVisitor extends ASTQueries { IScope scope = getContainingScope(expr); try { IBinding[] bs = scope.find(PTRDIFF_T); - if (bs.length > 0) { - for (IBinding b : bs) { - if (b instanceof IType) { - if (b instanceof ICInternalBinding == false || - CVisitor.declaredBefore(((ICInternalBinding) b).getPhysicalNode(), expr)) { - return (IType) b; - } + for (IBinding b : bs) { + if (b instanceof IType) { + if (b instanceof ICInternalBinding == false || + CVisitor.declaredBefore(((ICInternalBinding) b).getPhysicalNode(), expr)) { + return (IType) b; } } } } catch (DOMException e) { } - return new CBasicType(Kind.eInt, IBasicType.IS_UNSIGNED | IBasicType.IS_LONG, expr); + return new CBasicType(Kind.eInt, 0, expr); } static IType getSize_T(IASTExpression expr) { IScope scope = getContainingScope(expr); try { IBinding[] bs = scope.find(SIZE_T); - if (bs.length > 0 && bs[0] instanceof IType) { - return (IType) bs[0]; + for (IBinding b : bs) { + if (b instanceof IType) { + if (b instanceof ICInternalBinding == false || + CVisitor.declaredBefore(((ICInternalBinding) b).getPhysicalNode(), expr)) { + return (IType) b; + } + } } } catch (DOMException e) { } 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 c3a7e82aff1..0451e72fb04 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 @@ -2089,7 +2089,7 @@ public class CPPVisitor extends ASTQueries { } } catch (DOMException e) { } - basicType= new CPPBasicType(Kind.eInt, IBasicType.IS_LONG | IBasicType.IS_UNSIGNED); + basicType= new CPPBasicType(Kind.eInt, 0); basicType.setFromExpression(binary); return basicType; }