diff options
author | Nathan Ridge | 2014-08-25 06:00:11 +0000 |
---|---|---|
committer | Sergey Prigogin | 2014-08-26 01:20:21 +0000 |
commit | 83600a15dc2eac7f7ff1db78b8793a2afddb3dc0 (patch) | |
tree | 5986e36489e28760646d3a01466cccd9ebf3f135 | |
parent | 905d722c3e981197296b4ea25f7c621565cae03a (diff) | |
download | org.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>
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(); } |