1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-06-05 16:56:04 +02:00

Bug 317004: Recursive definition of size_t.

This commit is contained in:
Markus Schorn 2010-06-23 10:09:51 +00:00
parent 2ec6a92a98
commit bc70607da5
4 changed files with 38 additions and 14 deletions

View file

@ -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,

View file

@ -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()));
}
}

View file

@ -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) {
}

View file

@ -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;
}