From c0903d7ad95acc190609d72cf7d047b6af9a387d Mon Sep 17 00:00:00 2001 From: Sergey Prigogin Date: Fri, 26 Oct 2012 00:38:03 +0200 Subject: [PATCH] Another typedef preservation fix. --- .../core/parser/tests/ast2/AST2CPPTests.java | 23 +++++++++++++++++++ .../parser/cpp/semantics/CPPTemplates.java | 2 +- .../core/dom/parser/cpp/semantics/EvalID.java | 13 +++-------- 3 files changed, 27 insertions(+), 11 deletions(-) diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2CPPTests.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2CPPTests.java index e96b9aa9d58..73c8603dc0c 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2CPPTests.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2CPPTests.java @@ -4813,6 +4813,29 @@ public class AST2CPPTests extends AST2BaseTest { assertEquals("vector::const_iterator", ASTTypeUtil.getType(it.getType(), false)); } + // template class char_traits {}; + // template > class basic_string {}; + // + // template struct vector { + // typedef T* iterator; + // iterator begin(); + // iterator end(); + // }; + // + // typedef basic_string string; + // + // void test() { + // vector v; + // for (auto s : v) { + // } + // } + public void testTypedefPreservation_380498_3() throws Exception { + BindingAssertionHelper ba= getAssertionHelper(); + ICPPVariable s = ba.assertNonProblem("s :", "s", ICPPVariable.class); + assertTrue(s.getType() instanceof ITypedef); + assertEquals("string", ASTTypeUtil.getType(s.getType(), false)); + } + // int f() { // return 5; // } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPTemplates.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPTemplates.java index b9a0dfc80d4..878ca093ec2 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPTemplates.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPTemplates.java @@ -1262,7 +1262,7 @@ public class CPPTemplates { } if (arg != null) { - IType t= arg.getTypeValue(); + IType t= arg.getOriginalTypeValue(); if (t != null) return t; } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/EvalID.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/EvalID.java index 9d1cf787526..d47fbbb1270 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/EvalID.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/EvalID.java @@ -13,6 +13,8 @@ package org.eclipse.cdt.internal.core.dom.parser.cpp.semantics; import static org.eclipse.cdt.core.dom.ast.IASTExpression.ValueCategory.LVALUE; import static org.eclipse.cdt.core.dom.ast.IASTExpression.ValueCategory.PRVALUE; +import static org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.SemanticUtil.TDEF; +import static org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.SemanticUtil.getNestedType; import org.eclipse.cdt.core.dom.ast.DOMException; import org.eclipse.cdt.core.dom.ast.IASTExpression; @@ -126,15 +128,6 @@ public class EvalID extends CPPEvaluation { @Override public IValue getValue(IASTNode point) { // Name lookup is not needed here because it was already done in the "instantiate" method. -// IBinding nameOwner = fNameOwner; -// if (nameOwner == null && fFieldOwner != null) -// nameOwner = (IBinding) fFieldOwner.getTypeOrFunctionSet(point); -// -// if (nameOwner instanceof ICPPClassType) { -// ICPPEvaluation eval = resolveName((ICPPClassType) nameOwner, fTemplateArgs, point); -// if (eval != null) -// return eval.getValue(point); -// } return Value.create(this); } @@ -294,7 +287,7 @@ public class EvalID extends CPPEvaluation { } else if (nameOwner instanceof IType) { IType type = CPPTemplates.instantiateType((IType) nameOwner, tpMap, packOffset, within, point); if (type instanceof IBinding) - nameOwner = (IBinding) type; + nameOwner = (IBinding) getNestedType(type, TDEF); } if (fieldOwner instanceof IProblemBinding || nameOwner instanceof IProblemBinding)