diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2TemplateTests.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2TemplateTests.java index 73eb1c0c404..14c50350b07 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2TemplateTests.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2TemplateTests.java @@ -5416,6 +5416,15 @@ public class AST2TemplateTests extends AST2TestBase { parseAndCheckBindings(); } + // template + // void test(T* a) { + // auto* b = a->f; + // b->g; + // } + public void testDependentNameWithAuto_407480() throws Exception { + parseAndCheckBindings(); + } + // struct S {}; // template void h(S s, Args... args) {} // void g() { diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/TemplateArgumentDeduction.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/TemplateArgumentDeduction.java index 6dd0f7bb428..2044afbc1ee 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/TemplateArgumentDeduction.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/TemplateArgumentDeduction.java @@ -31,6 +31,7 @@ import org.eclipse.cdt.core.dom.ast.ASTTypeUtil; import org.eclipse.cdt.core.dom.ast.DOMException; import org.eclipse.cdt.core.dom.ast.IASTExpression.ValueCategory; import org.eclipse.cdt.core.dom.ast.IASTNode; +import org.eclipse.cdt.core.dom.ast.IASTUnaryExpression; import org.eclipse.cdt.core.dom.ast.IArrayType; import org.eclipse.cdt.core.dom.ast.IBasicType; import org.eclipse.cdt.core.dom.ast.IBinding; @@ -765,14 +766,20 @@ public class TemplateArgumentDeduction { p = ptrP.getType(); a = ptrA.getType(); } else if (p instanceof IPointerType) { - if (!(a instanceof IPointerType)) - return false; final IPointerType ptrP = (IPointerType) p; - final IPointerType ptrA = (IPointerType) a; - if (!allowCVQConversion && (ptrP.isConst() != ptrA.isConst() || ptrP.isVolatile() != ptrA.isVolatile())) - return false; p = ptrP.getType(); - a = ptrA.getType(); + if (a instanceof TypeOfDependentExpression) { + ICPPEvaluation eval = ((TypeOfDependentExpression) a).getEvaluation(); + eval = new EvalUnary(IASTUnaryExpression.op_star, eval, null, eval.getTemplateDefinition()); + a = new TypeOfDependentExpression(eval); + } else { + if (!(a instanceof IPointerType)) + return false; + final IPointerType ptrA = (IPointerType) a; + if (!allowCVQConversion && (ptrP.isConst() != ptrA.isConst() || ptrP.isVolatile() != ptrA.isVolatile())) + return false; + a = ptrA.getType(); + } } else if (p instanceof ICPPReferenceType) { if (!(a instanceof ICPPReferenceType)) { return false;