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