diff options
author | Vlad Ivanov | 2018-05-07 13:45:18 +0000 |
---|---|---|
committer | Nathan Ridge | 2018-05-08 07:32:11 +0000 |
commit | 0bf58281c250678e33db11db6c8163428b167220 (patch) | |
tree | da21bce560db25b40115be911c3a87eb3a7fce44 | |
parent | 9cf1f0625ef6dcd4b6d57d416665b435f6405ca7 (diff) | |
download | org.eclipse.cdt-0bf58281c250678e33db11db6c8163428b167220.tar.gz org.eclipse.cdt-0bf58281c250678e33db11db6c8163428b167220.tar.xz org.eclipse.cdt-0bf58281c250678e33db11db6c8163428b167220.zip |
Bug 519361: use placeholder type for template<auto>
Change-Id: I40f96479148a92618050ba50d7761f478f92024d
Signed-off-by: Vlad Ivanov <vlad@ivanov.email>
3 files changed, 24 insertions, 7 deletions
diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/cxx17/TemplateAutoTests.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/cxx17/TemplateAutoTests.java index f50b4cd32a7..920fb2d90f6 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/cxx17/TemplateAutoTests.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/cxx17/TemplateAutoTests.java @@ -33,4 +33,18 @@ public class TemplateAutoTests extends AST2CPPTestBase { public void testTemplateNontypeParameterTypeDeductionParsing_519361() throws Exception { parseAndCheckBindings(); } + + // template<typename T> + // struct Helper {}; + // + // void test() {} + // + // template<auto F> + // struct C { + // using T = decltype(F); + // using H = Helper<T>; + // }; + public void testTemplateNontypeParameterTypeDeductionParsing_519361_2() throws Exception { + parseAndCheckBindings(); + } } 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 2ce50e1d203..379abee791f 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 @@ -164,6 +164,7 @@ import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPMethodSpecialization; import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPMethodTemplateSpecialization; import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPParameterPackType; import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPParameterSpecialization; +import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPPlaceholderType; import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPPointerToMemberType; import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPPointerType; import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPTemplateDefinition; @@ -2866,11 +2867,9 @@ public class CPPTemplates { return null; } - if (paramType instanceof ProblemType) { + if (paramType instanceof CPPPlaceholderType) { // Partial support for C++17 template <auto> - if (((ProblemType) paramType).getID() == ProblemType.TYPE_CANNOT_DEDUCE_AUTO_TYPE) { - return arg; - } + return arg; } Cost cost = Conversions.checkImplicitConversionSequence(p, a, LVALUE, UDCMode.FORBIDDEN, 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 e5a2c957a87..be998e398eb 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 @@ -2214,9 +2214,13 @@ public class CPPVisitor extends ASTQueries { return createAutoParameterType(declSpec, declarator, (ICPPASTParameterDeclaration) declarator.getParent(), placeholderKind); } else { - // 'auto' used as the type of a template parameter. - // This is a C++17 feature we don't yet support. - return ProblemType.CANNOT_DEDUCE_AUTO_TYPE; + if (placeholderKind == PlaceholderKind.Auto) { + // 'auto' used as the type of a template parameter. + // This is a partially supported C++17 feature. + return new CPPPlaceholderType(placeholderKind); + } else { + return ProblemType.CANNOT_DEDUCE_DECLTYPE_AUTO_TYPE; + } } } ICPPASTInitializerClause autoInitClause= null; |