From 3817999a3f2ea7b096ee817fdaebecd92da20b27 Mon Sep 17 00:00:00 2001 From: Markus Schorn Date: Wed, 21 May 2008 14:17:48 +0000 Subject: [PATCH] Fix redefinition of t_ptrdiff, bug 230895. --- .../cdt/core/parser/tests/ast2/AST2Tests.java | 15 +++++++++++++++ .../cdt/internal/core/dom/parser/c/CVisitor.java | 11 +++++++++-- .../core/dom/parser/cpp/semantics/CPPVisitor.java | 8 ++++++-- 3 files changed, 30 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 2c165313f64..135d3c97a2d 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 @@ -4721,4 +4721,19 @@ public class AST2Tests extends AST2BaseTest { assertSame(b2, b3); } } + + // #define foo __typeof__((int*)0 - (int*)0) + // typedef foo ptrdiff_t; + public void testRedefinePtrdiff_Bug230895() throws Exception { + final boolean[] isCpps= {false, true}; + String code= getAboveComment(); + for (boolean isCpp : isCpps) { + BindingAssertionHelper ba= new BindingAssertionHelper(getAboveComment(), isCpp); + IBinding b1= ba.assertNonProblem("ptrdiff_t", 9); + assertInstance(b1, ITypedef.class); + ITypedef td= (ITypedef) b1; + IType t= td.getType(); + assertFalse(t instanceof ITypedef); + } + } } 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 140cf09e88a..84563324521 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 @@ -736,8 +736,15 @@ public class CVisitor { IScope scope = getContainingScope(expression); try { IBinding[] bs = scope.find(PTRDIFF_T); - if (bs.length > 0 && bs[0] instanceof IType) { - return (IType) bs[0]; + if (bs.length > 0) { + for (IBinding b : bs) { + if (b instanceof IType) { + if (b instanceof ICInternalBinding == false || + CVisitor.declaredBefore(((ICInternalBinding) b).getPhysicalNode(), binary)) { + 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 40a4d20d93e..49b90922cc7 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 @@ -1918,8 +1918,12 @@ public class CPPVisitor { IScope scope = getContainingScope(expression); try { IBinding[] bs = scope.find(PTRDIFF_T); - if (bs.length > 0 && bs[0] instanceof IType) { - return (IType) bs[0]; + if (bs.length > 0) { + for (IBinding b : bs) { + if (b instanceof IType && CPPSemantics.declaredBefore(b, binary, false)) { + return (IType) b; + } + } } } catch (DOMException e) { }