Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVlad Ivanov2018-05-07 13:45:18 +0000
committerNathan Ridge2018-05-08 07:32:11 +0000
commit0bf58281c250678e33db11db6c8163428b167220 (patch)
treeda21bce560db25b40115be911c3a87eb3a7fce44
parent9cf1f0625ef6dcd4b6d57d416665b435f6405ca7 (diff)
downloadorg.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>
-rw-r--r--core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/cxx17/TemplateAutoTests.java14
-rw-r--r--core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPTemplates.java7
-rw-r--r--core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPVisitor.java10
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;

Back to the top