From 255cd71f24199f74c3c0c060c5720070ff010bcb Mon Sep 17 00:00:00 2001 From: Nathan Ridge Date: Sun, 26 May 2013 11:44:07 -0700 Subject: [PATCH] Bug 409056 - Invalid ambiguity with templated conversion operator Change-Id: I9f56c875899ee2543aab2090387dbbdfd0e489b4 Reviewed-on: https://git.eclipse.org/r/13151 Reviewed-by: Sergey Prigogin IP-Clean: Sergey Prigogin Tested-by: Sergey Prigogin --- .../parser/tests/ast2/AST2TemplateTests.java | 33 +++++++++++++++++++ .../semantics/TemplateArgumentDeduction.java | 4 +-- 2 files changed, 35 insertions(+), 2 deletions(-) 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 04a8760e4ea..163aeebf33c 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 @@ -125,6 +125,14 @@ public class AST2TemplateTests extends AST2TestBase { private IASTTranslationUnit parseAndCheckBindings(final String code) throws Exception { return parseAndCheckBindings(code, CPP); } + + protected IASTTranslationUnit parseAndCheckImplicitNameBindings() throws Exception { + IASTTranslationUnit tu = parse(getAboveComment(), CPP, false, true, false); + NameCollector col = new NameCollector(true /* visit implicit names */); + tu.accept(col); + assertNoProblemBindings(col); + return tu; + } protected BindingAssertionHelper getAssertionHelper() throws ParserException, IOException { String code= getAboveComment(); @@ -7130,6 +7138,31 @@ public class AST2TemplateTests extends AST2TestBase { assertNotNull(val); assertEquals(0 /* false */, val.longValue()); } + + // struct S { + // S(int); + // }; + // + // template + // struct meta {}; + // + // template <> + // struct meta { + // typedef void type; + // }; + // + // struct B { + // template ::type> + // operator T() const; + // }; + // + // struct A { + // S waldo; + // A() : waldo(B{}) {} + // }; + public void testSFINAEInTemplatedConversionOperator_409056() throws Exception { + parseAndCheckImplicitNameBindings(); + } // template // struct M { 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 2044afbc1ee..a698a904043 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 @@ -370,8 +370,8 @@ public class TemplateArgumentDeduction { final ICPPTemplateParameter tpar = tmplParams[i]; ICPPTemplateArgument deducedArg= map.getArgument(tpar); if (deducedArg == null) { - deducedArg= tpar.getDefaultValue(); - if (deducedArg == null) + deducedArg= CPPTemplates.instantiateArgument(tpar.getDefaultValue(), map, -1, null, point); + if (!CPPTemplates.isValidArgument(deducedArg)) return null; } result[i]= deducedArg;