Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNathan Ridge2014-08-25 06:00:11 +0000
committerSergey Prigogin2014-08-26 01:20:21 +0000
commit83600a15dc2eac7f7ff1db78b8793a2afddb3dc0 (patch)
tree5986e36489e28760646d3a01466cccd9ebf3f135
parent905d722c3e981197296b4ea25f7c621565cae03a (diff)
downloadorg.eclipse.cdt-83600a15dc2eac7f7ff1db78b8793a2afddb3dc0.tar.gz
org.eclipse.cdt-83600a15dc2eac7f7ff1db78b8793a2afddb3dc0.tar.xz
org.eclipse.cdt-83600a15dc2eac7f7ff1db78b8793a2afddb3dc0.zip
Bug 399145 - Point of declaration of template parameter
Change-Id: Ib5b192758d413ab1ac5116243ac2e4a7f7c7951c Signed-off-by: Nathan Ridge <zeratul976@hotmail.com> Reviewed-on: https://git.eclipse.org/r/32213 Reviewed-by: Sergey Prigogin <eclipse.sprigogin@gmail.com> Tested-by: Sergey Prigogin <eclipse.sprigogin@gmail.com>
-rw-r--r--core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2TemplateTests.java22
-rw-r--r--core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPSemantics.java17
2 files changed, 38 insertions, 1 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 31e3a6fa056..bf2aca54116 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
@@ -8515,4 +8515,26 @@ public class AST2TemplateTests extends AST2TestBase {
public void testConstexprFunctionCallWithNonConstexprArguments_429891() throws Exception {
parseAndCheckBindings();
}
+
+ // template <typename> class A {};
+ // template <int> class B {};
+ // const int D = 4;
+ //
+ // // Type template parameter
+ // template <typename A = A<int>>
+ // struct C1 {};
+ // C1<> c1;
+ //
+ // // Template template parameter
+ // template <template <typename> class A = A>
+ // struct C2 { typedef A<int> type; };
+ // C2<>::type c2;
+ //
+ // // Non-type template parameter
+ // template <int D = D>
+ // struct C3 { typedef B<D> type; };
+ // C3<>::type c3;
+ public void testNameLookupInDefaultTemplateArgument_399145() throws Exception {
+ parseAndCheckBindings();
+ }
}
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPSemantics.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPSemantics.java
index c1b603e26c3..5b10815e7f0 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPSemantics.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPSemantics.java
@@ -1906,7 +1906,13 @@ public class CPPSemantics {
while (dtor.getParent() instanceof IASTDeclarator)
dtor = (IASTDeclarator) dtor.getParent();
IASTInitializer init = dtor.getInitializer();
- if (init != null)
+ // [basic.scope.pdecl]/p9: The point of declaration for a template parameter
+ // is immediately after its complete template-parameter.
+ // Note: can't just check "dtor.getParent() instanceof ICPPASTTemplateParameter"
+ // because function parameter declarations implement ICPPASTTemplateParameter too.
+ boolean isTemplateParameter = dtor.getParent() instanceof ICPPASTTemplateParameter
+ && dtor.getParent().getPropertyInParent() == ICPPASTTemplateDeclaration.PARAMETER;
+ if (init != null && !isTemplateParameter)
pointOfDecl = ((ASTNode) init).getOffset() - 1;
else
pointOfDecl = ((ASTNode) dtor).getOffset() + ((ASTNode) dtor).getLength();
@@ -1926,6 +1932,15 @@ public class CPPSemantics {
} else if (prop == ICPPASTNamespaceAlias.ALIAS_NAME) {
nd = (ASTNode) nd.getParent();
pointOfDecl = nd.getOffset() + nd.getLength();
+ } else if (prop == ICPPASTSimpleTypeTemplateParameter.PARAMETER_NAME
+ || prop == ICPPASTTemplatedTypeTemplateParameter.PARAMETER_NAME) {
+ // [basic.scope.pdecl]/p9: The point of declaration for a template parameter
+ // is immediately after its complete template-parameter.
+ // Type and template template parameters are handled here;
+ // non-type template parameters are handled in the DECLARATOR_NAME
+ // case above.
+ nd = (ASTNode) nd.getParent();
+ pointOfDecl = nd.getOffset() + nd.getLength();
} else {
pointOfDecl = nd.getOffset() + nd.getLength();
}

Back to the top