Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNathan Ridge2018-11-27 07:00:10 +0000
committerNathan Ridge2018-12-05 19:34:40 +0000
commit089d7e1d6124620ff8900acfb238dcb40b7bd795 (patch)
tree0b2483603c873e1b178be29247dc283aa7a42e91
parent3ee513f3240f9d542ef9524b4410946e5b1e14b0 (diff)
downloadorg.eclipse.cdt-089d7e1d6124620ff8900acfb238dcb40b7bd795.tar.gz
org.eclipse.cdt-089d7e1d6124620ff8900acfb238dcb40b7bd795.tar.xz
org.eclipse.cdt-089d7e1d6124620ff8900acfb238dcb40b7bd795.zip
Bug 541549 - Pack expansion expression in type of alias template
Alias templates can be instantiated with dependent arguments, which can themselves contain a pack expansion, so we need to take care that pack expansion expressions are instantiated correctly. This was previously fixed for pack expansions of types and template arguments in bug 486971. The patch also fixes a bug in CPPTypedef.getType() where alias declarations weren't handled correctly. (This bug would only occur during debugging as normally the type would be computed via setType(). Change-Id: Ie70a923fc9dd0f177b7bfb429b8f1387966b416d
-rw-r--r--core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2TemplateTests.java17
-rw-r--r--core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPTypedef.java12
-rw-r--r--core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPDependentEvaluation.java6
-rw-r--r--core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPTemplates.java6
4 files changed, 38 insertions, 3 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 fb2861ea67d..e73f0ec9d8b 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
@@ -11123,6 +11123,23 @@ public class AST2TemplateTests extends AST2CPPTestBase {
parseAndCheckBindings();
}
+ // void foo(int);
+ //
+ // template <typename... T>
+ // using Res = decltype(foo(T()...));
+ //
+ // template <typename... T>
+ // struct Bind {
+ // using Type = Res<T...>;
+ // };
+ //
+ // using Waldo = Bind<int>::Type;
+ public void testPackExpansionExprInAliasTemplate_541549() throws Exception {
+ BindingAssertionHelper helper = getAssertionHelper();
+ IType waldo = helper.assertNonProblem("Waldo");
+ assertSameType(waldo, CommonCPPTypes.void_);
+ }
+
// template <class T>
// void foo(T = {});
//
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPTypedef.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPTypedef.java
index ee563259870..9a5b724fa33 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPTypedef.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPTypedef.java
@@ -24,12 +24,14 @@ import org.eclipse.cdt.core.dom.ast.IBinding;
import org.eclipse.cdt.core.dom.ast.IScope;
import org.eclipse.cdt.core.dom.ast.IType;
import org.eclipse.cdt.core.dom.ast.ITypedef;
+import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTAliasDeclaration;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTQualifiedName;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPBlockScope;
import org.eclipse.cdt.core.parser.util.ArrayUtil;
import org.eclipse.cdt.internal.core.dom.Linkage;
import org.eclipse.cdt.internal.core.dom.parser.ASTNode;
import org.eclipse.cdt.internal.core.dom.parser.ITypeContainer;
+import org.eclipse.cdt.internal.core.dom.parser.ProblemType;
import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPVisitor;
import org.eclipse.core.runtime.PlatformObject;
@@ -77,7 +79,15 @@ public class CPPTypedef extends PlatformObject implements ITypedef, ITypeContain
@Override
public IType getType() {
if (type == null) {
- type = CPPVisitor.createType((IASTDeclarator) declarations[0].getParent());
+ IASTNode declParent = declarations[0].getParent();
+ if (declParent instanceof IASTDeclarator) {
+ type = CPPVisitor.createType((IASTDeclarator) declParent);
+ } else if (declParent instanceof ICPPASTAliasDeclaration) {
+ type = CPPVisitor.createType(((ICPPASTAliasDeclaration) declParent).getMappingTypeId());
+ } else {
+ assert false;
+ type = new ProblemType(ProblemType.TYPE_UNRESOLVED_NAME);
+ }
}
return type;
}
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPDependentEvaluation.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPDependentEvaluation.java
index 38848aaa7cd..5b4003c5fea 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPDependentEvaluation.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPDependentEvaluation.java
@@ -131,13 +131,19 @@ public abstract class CPPDependentEvaluation extends CPPEvaluation {
int shift = packSize - 1;
ICPPEvaluation[] newResult = new ICPPEvaluation[expressions.length + resultShift + shift];
System.arraycopy(result, 0, newResult, 0, i + resultShift);
+ context.setExpandPack(true);
int oldPackOffset = context.getPackOffset();
for (int j = 0; j < packSize; ++j) {
context.setPackOffset(j);
newEval = pattern.instantiate(context, maxDepth);
+ if (context.isPackExpanded()) {
+ newEval = new EvalPackExpansion(newEval, newEval.getTemplateDefinition());
+ context.setPackExpanded(false);
+ }
newResult[i + resultShift + j] = newEval;
}
context.setPackOffset(oldPackOffset);
+ context.setExpandPack(false);
result = newResult;
resultShift += shift;
continue;
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 0c6e1954ffd..5a6327ca3bd 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
@@ -318,7 +318,7 @@ public class CPPTemplates {
}
IType aliasedType = aliasTemplate.getType();
IBinding owner = aliasTemplate.getOwner();
- return createAliasTemplaceInstance(aliasTemplate, args, parameterMap, aliasedType, owner);
+ return createAliasTemplateInstance(aliasTemplate, args, parameterMap, aliasedType, owner);
} catch (DOMException e) {
return e.getProblem();
}
@@ -867,7 +867,7 @@ public class CPPTemplates {
}
}
- private static IBinding createAliasTemplaceInstance(ICPPAliasTemplate aliasTemplate, ICPPTemplateArgument[] args,
+ private static IBinding createAliasTemplateInstance(ICPPAliasTemplate aliasTemplate, ICPPTemplateArgument[] args,
ICPPTemplateParameterMap parameterMap, IType aliasedType, IBinding owner) {
InstantiationContext context = createInstantiationContext(parameterMap, owner);
IType instantiatedType = instantiateType(aliasedType, context);
@@ -1350,6 +1350,8 @@ public class CPPTemplates {
if (instantiated != null) {
instantiated = new CPPParameterPackType(instantiated);
}
+ // TODO: instantiateArguments() calls context.setPackExpanded(false) here
+ // Do we need to do the same here?
}
result[j++] = instantiated;

Back to the top