1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-04-29 19:45:01 +02:00

disallow using a template name as a type name in a simple declaration

This commit is contained in:
Andrew Ferguson 2008-05-07 11:27:05 +00:00
parent c2f4ab53ca
commit 73b13e3128
3 changed files with 17 additions and 10 deletions

View file

@ -2474,7 +2474,7 @@ public class AST2TemplateTests extends AST2BaseTest {
//
// C c1;
// C<> c2; // ok - default args
public void _testMissingTemplateArgumentLists() throws Exception {
public void testMissingTemplateArgumentLists() throws Exception {
BindingAssertionHelper ba=new BindingAssertionHelper(getAboveComment(), true);
ba.assertProblem("B b1", 1);
ba.assertNonProblem("B<> b2", 1, ICPPTemplateDefinition.class, ICPPClassType.class);

View file

@ -10,12 +10,6 @@
* Markus Schorn (Wind River Systems)
* Norbert Ploett (Siemens AG)
*******************************************************************************/
/*
* Created on May 16, 2003
*
* To change the template for this generated file go to
* Window>Preferences>Java>Code Generation>Code and Comments
*/
package org.eclipse.cdt.core.suite;
import junit.framework.Test;
@ -38,9 +32,6 @@ import org.eclipse.cdt.internal.pdom.tests.PDOMTests;
/**
* @author vhirsl
*
* To change the template for this generated type comment go to
* Window>Preferences>Java>Code Generation>Code and Comments
*/
public class AutomatedIntegrationSuite extends TestSuite {

View file

@ -234,6 +234,9 @@ public class CPPSemantics {
}
}
}
/* 14.6.1-1: Class template name without argument list is equivalent to the injected-class-name followed by
* the template-parameters of the class template enclosed in <> */
if (binding instanceof ICPPClassTemplate) {
ASTNodeProperty prop = data.astName.getPropertyInParent();
if (prop != ICPPASTQualifiedName.SEGMENT_NAME && prop != ICPPASTTemplateId.TEMPLATE_NAME &&
@ -256,7 +259,20 @@ public class CPPSemantics {
} catch (DOMException e) {
}
}
/* If the class template name is used as a type name in a simple declaration,
* outside of the class template scope, mark it as a problem.
*/
if (binding instanceof ICPPClassTemplate) {
IASTNode parent= data.astName.getParent();
if(parent instanceof IASTNamedTypeSpecifier) {
if(parent.getParent() instanceof IASTSimpleDeclaration) {
binding = new ProblemBinding(data.astName, IProblemBinding.SEMANTIC_INVALID_TYPE, data.name());
}
}
}
}
if (binding instanceof ICPPClassType && data.considerConstructors) {
ICPPClassType cls = (ICPPClassType) binding;
if (data.astName instanceof ICPPASTTemplateId && cls instanceof ICPPTemplateDefinition) {