1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-07-01 06:05:24 +02:00

fix bug 60422 - Template offsets are not correct in Structural Parse mode

Fix bug 60480 - Template parameter <int> is not parsed correctly in Structural parse mode
fix offset information for template parameters
This commit is contained in:
Andrew Niefer 2004-04-29 19:39:21 +00:00
parent f12fae4a2a
commit dc66afff94
10 changed files with 194 additions and 53 deletions

View file

@ -212,7 +212,7 @@ public interface IASTFactory
public IASTTemplateDeclaration createTemplateDeclaration( IASTScope scope, List templateParameters, boolean exported, int startingOffset, int startingLine ) throws ASTSemanticException;
public IASTTemplateParameter createTemplateParameter( IASTTemplateParameter.ParamKind kind, String identifier, IASTTypeId defaultValue, IASTParameterDeclaration parameter, List parms, IASTCodeScope parameterScope ) throws ASTSemanticException;
public IASTTemplateParameter createTemplateParameter( IASTTemplateParameter.ParamKind kind, String identifier, IASTTypeId defaultValue, IASTParameterDeclaration parameter, List parms, IASTCodeScope parameterScope, int startingOffset, int startingLine, int nameOffset, int nameEndOffset, int nameLine, int endingOffset, int endingLine ) throws ASTSemanticException;
public IASTTemplateInstantiation createTemplateInstantiation(IASTScope scope, int startingOffset, int startingLine);

View file

@ -428,6 +428,7 @@ public abstract class Parser extends ExpressionParser implements IParser
protected IASTDeclaration templateDeclaration(IASTScope scope)
throws EndOfFileException, BacktrackException
{
IToken mark = mark();
IToken firstToken = null;
boolean exported = false;
if (LT(1) == IToken.t_export)
@ -452,6 +453,7 @@ public abstract class Parser extends ExpressionParser implements IParser
catch (Exception e)
{
logException( "templateDeclaration:createTemplateInstantiation", e ); //$NON-NLS-1$
backup( mark );
throw backtrack;
}
templateInstantiation.enterScope( requestor );
@ -480,6 +482,7 @@ public abstract class Parser extends ExpressionParser implements IParser
catch (Exception e)
{
logException( "templateDeclaration:createTemplateSpecialization", e ); //$NON-NLS-1$
backup( mark );
throw backtrack;
}
templateSpecialization.enterScope(requestor);
@ -524,6 +527,7 @@ public abstract class Parser extends ExpressionParser implements IParser
}
catch (BacktrackException bt)
{
backup( mark );
throw bt;
}
}
@ -569,11 +573,10 @@ public abstract class Parser extends ExpressionParser implements IParser
return returnValue;
if (LT(1) == IToken.t_class || LT(1) == IToken.t_typename)
{
IASTTemplateParameter.ParamKind kind =
(consume().getType() == IToken.t_class)
IASTTemplateParameter.ParamKind kind = (consume().getType() == IToken.t_class)
? IASTTemplateParameter.ParamKind.CLASS
: IASTTemplateParameter.ParamKind.TYPENAME;
IToken startingToken = lastToken;
IToken id = null;
IASTTypeId typeId = null;
try
@ -603,7 +606,12 @@ public abstract class Parser extends ExpressionParser implements IParser
typeId,
null,
null,
( parameterScope instanceof IASTCodeScope ) ? (IASTCodeScope) parameterScope : null ));
( parameterScope instanceof IASTCodeScope ) ? (IASTCodeScope) parameterScope : null,
startingToken.getOffset(), startingToken.getLineNumber(),
(id != null) ? id.getOffset() : 0,
(id != null) ? id.getEndOffset() : 0,
(id != null) ? id.getLineNumber() : 0,
lastToken.getEndOffset(), lastToken.getLineNumber() ));
}
catch (Exception e)
{
@ -615,6 +623,7 @@ public abstract class Parser extends ExpressionParser implements IParser
else if (LT(1) == IToken.t_template)
{
consume(IToken.t_template);
IToken startingToken = lastToken;
consume(IToken.tLT);
List subResult = templateParameterList(parameterScope);
@ -643,7 +652,12 @@ public abstract class Parser extends ExpressionParser implements IParser
optionalTypeId,
null,
subResult,
( parameterScope instanceof IASTCodeScope ) ? (IASTCodeScope) parameterScope : null ));
( parameterScope instanceof IASTCodeScope ) ? (IASTCodeScope) parameterScope : null,
startingToken.getOffset(), startingToken.getLineNumber(),
(optionalId != null) ? optionalId.getOffset() : 0,
(optionalId != null) ? optionalId.getEndOffset() : 0,
(optionalId != null) ? optionalId.getLineNumber() : 0,
lastToken.getEndOffset(), lastToken.getLineNumber() ));
}
catch (Exception e)
{
@ -660,10 +674,8 @@ public abstract class Parser extends ExpressionParser implements IParser
{
ParameterCollection c = new ParameterCollection();
parameterDeclaration(c, parameterScope);
DeclarationWrapper wrapper =
(DeclarationWrapper)c.getParameters().get(0);
Declarator declarator =
(Declarator)wrapper.getDeclarators().next();
DeclarationWrapper wrapper = (DeclarationWrapper)c.getParameters().get(0);
Declarator declarator = (Declarator)wrapper.getDeclarators().next();
try
{
returnValue.add(
@ -677,11 +689,17 @@ public abstract class Parser extends ExpressionParser implements IParser
wrapper.getTypeSpecifier(),
declarator.getPointerOperators(),
declarator.getArrayModifiers(),
null, null, declarator.getName() == null
? "" //$NON-NLS-1$
: declarator.getName(), declarator.getInitializerClause(), wrapper.getStartingOffset(), wrapper.getStartingLine(), declarator.getNameStartOffset(), declarator.getNameEndOffset(), declarator.getNameLine(), wrapper.getEndOffset(), wrapper.getEndLine()),
null, null,
declarator.getName() == null ? "" : declarator.getName(), //$NON-NLS-1$
declarator.getInitializerClause(),
wrapper.getStartingOffset(), wrapper.getStartingLine(),
declarator.getNameStartOffset(), declarator.getNameEndOffset(), declarator.getNameLine(),
wrapper.getEndOffset(), wrapper.getEndLine()),
null,
( parameterScope instanceof IASTCodeScope ) ? (IASTCodeScope) parameterScope : null ));
( parameterScope instanceof IASTCodeScope ) ? (IASTCodeScope) parameterScope : null,
wrapper.getStartingOffset(), wrapper.getStartingLine(),
declarator.getNameStartOffset(), declarator.getNameEndOffset(), declarator.getNameLine(),
wrapper.getEndOffset(), wrapper.getEndLine() ));
}
catch (Exception e)
{

View file

@ -11,6 +11,7 @@
package org.eclipse.cdt.internal.core.parser.ast.complete;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import org.eclipse.cdt.core.parser.ISourceElementRequestor;
@ -21,6 +22,7 @@ import org.eclipse.cdt.core.parser.ast.IASTTemplateDeclaration;
import org.eclipse.cdt.internal.core.parser.ast.NamedOffsets;
import org.eclipse.cdt.internal.core.parser.pst.IContainerSymbol;
import org.eclipse.cdt.internal.core.parser.pst.ISymbol;
import org.eclipse.cdt.internal.core.parser.pst.ISymbolASTExtension;
import org.eclipse.cdt.internal.core.parser.pst.ITemplateFactory;
import org.eclipse.cdt.internal.core.parser.pst.ITemplateSymbol;
import org.eclipse.cdt.internal.core.parser.pst.StandardSymbolExtension;
@ -63,7 +65,7 @@ public class ASTTemplateDeclaration extends ASTSymbol implements IASTTemplateDec
factory.pushTemplate( template );
templateParameters = parameters;
templateParameters = ( parameters != null ) ? parameters : new LinkedList();
ownerScope = scope;
}
@ -85,8 +87,14 @@ public class ASTTemplateDeclaration extends ASTSymbol implements IASTTemplateDec
public IASTDeclaration getOwnedDeclaration()
{
if( owned != null && owned.getASTExtension() != null ){
ASTNode node = owned.getASTExtension().getPrimaryDeclaration();
return ( node instanceof IASTDeclaration ) ? (IASTDeclaration)node : null;
ISymbolASTExtension extension = owned.getASTExtension();
Iterator i = extension.getAllDefinitions();
ASTSymbol s = null;
while( i.hasNext() ){
s = (ASTSymbol) i.next();
}
return s;
}
IContainerSymbol ownedSymbol = getTemplateSymbol().getTemplatedSymbol();

View file

@ -40,12 +40,17 @@ public class ASTTemplateParameter extends ASTSymbol implements IASTTemplateParam
* @param parameter2
* @param parms2
*/
public ASTTemplateParameter(ISymbol sym, IASTTypeId defVal, IASTParameterDeclaration param, List parms ) {
public ASTTemplateParameter(ISymbol sym, IASTTypeId defVal, IASTParameterDeclaration param, List parms, int startingOffset, int startingLine, int nameOffset, int nameEndOffset, int nameLine, int endingOffset, int endingLine ) {
super( sym );
symbol = sym;
defaultValue = defVal;
parameter = (ASTParameterDeclaration) param;
this.parms = parms;
setStartingOffsetAndLineNumber(startingOffset, startingLine);
setEndingOffsetAndLineNumber(endingOffset, endingLine);
setNameOffset(nameOffset);
setNameEndOffsetAndLineNumber( nameEndOffset, nameLine );
}
/* (non-Javadoc)
* @see org.eclipse.cdt.core.parser.ast.IASTTemplateParameter#getTemplateParameterKind()

View file

@ -909,12 +909,16 @@ public class CompleteParseASTFactory extends BaseASTFactory implements IASTFacto
return null;
}
Iterator i = symbol.getASTExtension().getAllDefinitions();
ASTSymbol declaration = i.hasNext() ? (ASTSymbol) i.next() : null;
ASTSymbol definition = i.hasNext() ? (ASTSymbol) i.next() : null;
// assert (symbol != null ) : "createReference cannot be called on null symbol ";
if( symbol.getTypeInfo().checkBit( TypeInfo.isTypedef ) ||
symbol.getASTExtension().getPrimaryDeclaration() instanceof IASTTypedefDeclaration )
return new ASTTypedefReference( offset, referenceElementName, (IASTTypedefDeclaration)symbol.getASTExtension().getPrimaryDeclaration());
return new ASTTypedefReference( offset, referenceElementName, (IASTTypedefDeclaration)declaration);
else if( symbol.getType() == TypeInfo.t_namespace )
return new ASTNamespaceReference( offset, referenceElementName, (IASTNamespaceDefinition)symbol.getASTExtension().getPrimaryDeclaration());
return new ASTNamespaceReference( offset, referenceElementName, (IASTNamespaceDefinition)declaration);
else if( symbol.getType() == TypeInfo.t_class ||
symbol.getType() == TypeInfo.t_struct ||
symbol.getType() == TypeInfo.t_union )
@ -922,10 +926,10 @@ public class CompleteParseASTFactory extends BaseASTFactory implements IASTFacto
else if( symbol.getType() == TypeInfo.t_enumeration )
return new ASTEnumerationReference( offset, referenceElementName, (IASTEnumerationSpecifier)symbol.getASTExtension().getPrimaryDeclaration() );
else if( symbol.getType() == TypeInfo.t_enumerator )
return new ASTEnumeratorReference( offset, referenceElementName, (IASTEnumerator)symbol.getASTExtension().getPrimaryDeclaration() );
return new ASTEnumeratorReference( offset, referenceElementName, (IASTEnumerator)declaration );
else if(( symbol.getType() == TypeInfo.t_function ) || (symbol.getType() == TypeInfo.t_constructor))
{
ASTNode referenced = symbol.getASTExtension().getPrimaryDeclaration();
ASTNode referenced = (definition != null) ? definition : declaration;
if( referenced instanceof IASTMethod )
return new ASTMethodReference( offset, referenceElementName, (IASTMethod)referenced );
else
@ -947,7 +951,7 @@ public class CompleteParseASTFactory extends BaseASTFactory implements IASTFacto
symbol.getContainingSymbol().getType() == TypeInfo.t_struct ||
symbol.getContainingSymbol().getType() == TypeInfo.t_union )
{
return new ASTFieldReference( offset, referenceElementName, (IASTField)symbol.getASTExtension().getPrimaryDeclaration());
return new ASTFieldReference( offset, referenceElementName, (IASTField)(definition != null ? definition : declaration ));
}
else if( ( symbol.getContainingSymbol().getType() == TypeInfo.t_function ||
symbol.getContainingSymbol().getType() == TypeInfo.t_constructor ) &&
@ -955,11 +959,11 @@ public class CompleteParseASTFactory extends BaseASTFactory implements IASTFacto
((IParameterizedSymbol)symbol.getContainingSymbol()).getParameterList() != null &&
((IParameterizedSymbol)symbol.getContainingSymbol()).getParameterList().contains( symbol ) )
{
return new ASTParameterReference( offset, referenceElementName, (IASTParameterDeclaration)symbol.getASTExtension().getPrimaryDeclaration() );
return new ASTParameterReference( offset, referenceElementName, (IASTParameterDeclaration)declaration );
}
else
{
ASTNode s = symbol.getASTExtension().getPrimaryDeclaration();
ASTNode s = (definition != null) ? definition : declaration;
if(s instanceof IASTVariable)
return new ASTVariableReference( offset, referenceElementName, (IASTVariable)s);
else if (s instanceof IASTParameterDeclaration)
@ -2807,7 +2811,8 @@ public class CompleteParseASTFactory extends BaseASTFactory implements IASTFacto
IASTTypeId defaultValue,
IASTParameterDeclaration parameter,
List parms,
IASTCodeScope parameterScope ) throws ASTSemanticException
IASTCodeScope parameterScope,
int startingOffset, int startingLine, int nameOffset, int nameEndOffset, int nameLine, int endingOffset, int endingLine ) throws ASTSemanticException
{
ISymbol symbol = null;
if( kind == ParamKind.TEMPLATE_LIST ){
@ -2830,7 +2835,6 @@ public class CompleteParseASTFactory extends BaseASTFactory implements IASTFacto
if( kind == ParamKind.CLASS || kind == ParamKind.TYPENAME ){
symbol.getTypeInfo().setTemplateParameterType( TypeInfo.t_typeName );
} else /*ParamKind.PARAMETER*/ {
pst.newSymbol( identifier, TypeInfo.t_templateParameter );
symbol.setName( parameter.getName() );
symbol.setTypeInfo( ((ASTSimpleTypeSpecifier)parameter.getTypeSpecifier()).getSymbol().getTypeInfo() );
symbol.getTypeInfo().setTemplateParameterType( symbol.getType() );
@ -2852,7 +2856,8 @@ public class CompleteParseASTFactory extends BaseASTFactory implements IASTFacto
} catch (ASTNotImplementedException e1) {
}
}
ASTTemplateParameter ast = new ASTTemplateParameter( symbol, defaultValue, parameter, parms );
ASTTemplateParameter ast = new ASTTemplateParameter( symbol, defaultValue, parameter, parms, startingOffset, startingLine, nameOffset, nameEndOffset, nameLine, endingOffset, endingLine );
attachSymbolExtension( symbol, ast, false );
@ -2865,7 +2870,9 @@ public class CompleteParseASTFactory extends BaseASTFactory implements IASTFacto
IASTScope scope,
int startingOffset, int startingLine)
{
return new ASTTemplateInstantiation( scope );
ASTTemplateInstantiation inst = new ASTTemplateInstantiation( scope );
inst.setStartingOffsetAndLineNumber( startingOffset, startingLine );
return inst;
}
/* (non-Javadoc)
* @see org.eclipse.cdt.core.parser.ast.IASTFactory#createTemplateSpecialization(org.eclipse.cdt.core.parser.ast.IASTScope, int)
@ -2877,7 +2884,7 @@ public class CompleteParseASTFactory extends BaseASTFactory implements IASTFacto
ITemplateSymbol template = pst.newTemplateSymbol( ParserSymbolTable.EMPTY_NAME );
ASTTemplateSpecialization ast = new ASTTemplateSpecialization( template, scope );
ast.setStartingOffsetAndLineNumber( startingOffset, startingLine );
attachSymbolExtension( template, ast, false );
return ast;

View file

@ -737,7 +737,8 @@ public class ExpressionParseASTFactory extends BaseASTFactory implements IASTFac
String identifier,
IASTTypeId defaultValue,
IASTParameterDeclaration parameter,
List parms, IASTCodeScope parameterScope) {
List parms, IASTCodeScope parameterScope,
int startingOffset, int startingLine, int nameOffset, int nameEndOffset, int nameLine, int endingOffset, int endingLine) {
// TODO Auto-generated method stub
return null;
}

View file

@ -16,15 +16,18 @@ import java.util.List;
import org.eclipse.cdt.core.parser.ISourceElementRequestor;
import org.eclipse.cdt.core.parser.ast.ASTNotImplementedException;
import org.eclipse.cdt.core.parser.ast.IASTNode;
import org.eclipse.cdt.core.parser.ast.IASTOffsetableNamedElement;
import org.eclipse.cdt.core.parser.ast.IASTParameterDeclaration;
import org.eclipse.cdt.core.parser.ast.IASTTemplateParameter;
import org.eclipse.cdt.internal.core.parser.ast.NamedOffsets;
/**
* @author jcamelon
*
*/
public class ASTTemplateParameter implements IASTTemplateParameter
public class ASTTemplateParameter implements IASTTemplateParameter, IASTOffsetableNamedElement
{
private final NamedOffsets offsets = new NamedOffsets();
private final List templateParms;
private final IASTParameterDeclaration parameter;
private final ParamKind kind;
@ -36,14 +39,19 @@ public class ASTTemplateParameter implements IASTTemplateParameter
* @param defaultValue
* @param parameter
*/
public ASTTemplateParameter(ParamKind kind, String identifier, String defaultValue, IASTParameterDeclaration parameter, List templateParms)
public ASTTemplateParameter(ParamKind kind, String identifier, String defaultValue, IASTParameterDeclaration parameter, List templateParms, int startingOffset, int startingLine, int nameOffset, int nameEndOffset, int nameLine, int endingOffset, int endingLine )
{
this.kind = kind;
this.identifier = identifier;
this.defaultValue = defaultValue;
this.parameter = parameter;
this.templateParms = templateParms;
setStartingOffsetAndLineNumber( startingOffset, startingLine );
setEndingOffsetAndLineNumber( endingOffset, endingLine );
setNameOffset( nameOffset );
setNameEndOffsetAndLineNumber(nameEndOffset, nameLine);
}
/* (non-Javadoc)
* @see org.eclipse.cdt.core.parser.ast.IASTTemplateParameter#getTemplateParameterKind()
*/
@ -103,4 +111,88 @@ public class ASTTemplateParameter implements IASTTemplateParameter
return null;
}
/* (non-Javadoc)
* @see org.eclipse.cdt.core.parser.ast.IASTOffsetableNamedElement#getName()
*/
public String getName() {
return identifier;
}
/* (non-Javadoc)
* @see org.eclipse.cdt.core.parser.ast.IASTOffsetableNamedElement#getNameOffset()
*/
public int getNameOffset() {
return offsets.getNameOffset();
}
/* (non-Javadoc)
* @see org.eclipse.cdt.core.parser.ast.IASTOffsetableNamedElement#setNameOffset(int)
*/
public void setNameOffset(int o) {
offsets.setNameOffset( o );
}
/* (non-Javadoc)
* @see org.eclipse.cdt.core.parser.ast.IASTOffsetableNamedElement#getNameEndOffset()
*/
public int getNameEndOffset() {
return offsets.getNameEndOffset();
}
/* (non-Javadoc)
* @see org.eclipse.cdt.core.parser.ast.IASTOffsetableNamedElement#setNameEndOffsetAndLineNumber(int, int)
*/
public void setNameEndOffsetAndLineNumber(int offset, int lineNumber) {
offsets.setNameEndOffsetAndLineNumber( offset, lineNumber );
}
/* (non-Javadoc)
* @see org.eclipse.cdt.core.parser.ast.IASTOffsetableNamedElement#getNameLineNumber()
*/
public int getNameLineNumber() {
return offsets.getNameLineNumber();
}
/* (non-Javadoc)
* @see org.eclipse.cdt.core.parser.ast.IASTOffsetableElement#setStartingOffsetAndLineNumber(int, int)
*/
public void setStartingOffsetAndLineNumber(int offset, int lineNumber) {
offsets.setStartingOffsetAndLineNumber( offset, lineNumber );
}
/* (non-Javadoc)
* @see org.eclipse.cdt.core.parser.ast.IASTOffsetableElement#setEndingOffsetAndLineNumber(int, int)
*/
public void setEndingOffsetAndLineNumber(int offset, int lineNumber) {
offsets.setEndingOffsetAndLineNumber(offset, lineNumber);
}
/* (non-Javadoc)
* @see org.eclipse.cdt.core.parser.ast.IASTOffsetableElement#getStartingOffset()
*/
public int getStartingOffset() {
return offsets.getStartingOffset();
}
/* (non-Javadoc)
* @see org.eclipse.cdt.core.parser.ast.IASTOffsetableElement#getEndingOffset()
*/
public int getEndingOffset() {
return offsets.getEndingOffset();
}
/* (non-Javadoc)
* @see org.eclipse.cdt.core.parser.ast.IASTOffsetableElement#getStartingLine()
*/
public int getStartingLine() {
return offsets.getStartingLine();
}
/* (non-Javadoc)
* @see org.eclipse.cdt.core.parser.ast.IASTOffsetableElement#getEndingLine()
*/
public int getEndingLine() {
return offsets.getEndingLine();
}
}

View file

@ -248,9 +248,9 @@ public class QuickParseASTFactory extends BaseASTFactory implements IASTFactory
/* (non-Javadoc)
* @see org.eclipse.cdt.core.parser.ast.IASTFactory#createTemplateParameter(org.eclipse.cdt.core.parser.ast.IASTTemplateParameter.ParameterKind, org.eclipse.cdt.core.parser.IToken, java.lang.String, org.eclipse.cdt.core.parser.ast.IASTParameterDeclaration)
*/
public IASTTemplateParameter createTemplateParameter(IASTTemplateParameter.ParamKind kind, String identifier, IASTTypeId defaultValue, IASTParameterDeclaration parameter, List parms, IASTCodeScope parameterScope)
public IASTTemplateParameter createTemplateParameter(IASTTemplateParameter.ParamKind kind, String identifier, IASTTypeId defaultValue, IASTParameterDeclaration parameter, List parms, IASTCodeScope parameterScope, int startingOffset, int startingLine, int nameOffset, int nameEndOffset, int nameLine, int endingOffset, int endingLine)
{
return new ASTTemplateParameter( kind, identifier, defaultValue != null ? defaultValue.getTypeOrClassName() : "", parameter, parms ); //$NON-NLS-1$
return new ASTTemplateParameter( kind, identifier, defaultValue != null ? defaultValue.getTypeOrClassName() : "", parameter, parms, startingOffset, startingLine, nameOffset, nameEndOffset, nameLine, endingOffset, endingLine ); //$NON-NLS-1$
}
/* (non-Javadoc)

View file

@ -58,36 +58,46 @@ public class ParserSymbolTable {
}
public IContainerSymbol newContainerSymbol( String name ){
if( name == null ) name = EMPTY_NAME;
return new ContainerSymbol( this, name );
}
public IContainerSymbol newContainerSymbol( String name, TypeInfo.eType type ){
if( name == null ) name = EMPTY_NAME;
return new ContainerSymbol( this, name, type );
}
public ISymbol newSymbol( String name ){
if( name == null ) name = EMPTY_NAME;
return new BasicSymbol( this, name );
}
public ISymbol newSymbol( String name, TypeInfo.eType type ){
if( name == null ) name = EMPTY_NAME;
return new BasicSymbol( this, name, type );
}
public IDerivableContainerSymbol newDerivableContainerSymbol( String name ){
if( name == null ) name = EMPTY_NAME;
return new DerivableContainerSymbol( this, name );
}
public IDerivableContainerSymbol newDerivableContainerSymbol( String name, TypeInfo.eType type ){
if( name == null ) name = EMPTY_NAME;
return new DerivableContainerSymbol( this, name, type );
}
public IParameterizedSymbol newParameterizedSymbol( String name ){
if( name == null ) name = EMPTY_NAME;
return new ParameterizedSymbol( this, name );
}
public IParameterizedSymbol newParameterizedSymbol( String name, TypeInfo.eType type ){
if( name == null ) name = EMPTY_NAME;
return new ParameterizedSymbol( this, name, type );
}
public ITemplateSymbol newTemplateSymbol( String name ){
if( name == null ) name = EMPTY_NAME;
return new TemplateSymbol( this, name );
}
public ISpecializedSymbol newSpecializedSymbol( String name ){
if( name == null ) name = EMPTY_NAME;
return new SpecializedSymbol( this, name );
}

View file

@ -202,30 +202,30 @@ public class TemplateSymbol extends ParameterizedSymbol implements ITemplateSymb
if( !param.isType( TypeInfo.t_templateParameter ) )
return false;
if( param.getName().equals( getName() ) ){
if( !getName().equals( ParserSymbolTable.EMPTY_NAME ) && param.getName().equals( getName() ) ){
return false;
}
if( param.getTypeInfo().getTemplateParameterType() != TypeInfo.t_typeName &&
param.getTypeInfo().getTemplateParameterType() != TypeInfo.t_template )
{
if( param.isType( TypeInfo.t_bool, TypeInfo.t_int ) ||
param.isType( TypeInfo.t_enumerator ) )
{
return true;
}
//a non-tpye template parameter shall have one of the following:
TypeInfo info = param.getTypeInfo();
//a non-type template parameter shall have one of the following:
//integral or enumeration type
//pointer to object or pointer to function
//reference to object or reference to function
//pointer to member
//14.1-7
//A non-type template-parameter shall not be declared to have floating point, class or void type
if( param.isType( TypeInfo.t_float ) ||
param.isType( TypeInfo.t_double )||
param.isType( TypeInfo.t_class ) ||
param.isType( TypeInfo.t_void ) )
if( info.getPtrOperators().size() == 0 )
if( info.getTemplateParameterType() == TypeInfo.t_float ||
info.getTemplateParameterType() == TypeInfo.t_double ||
info.getTemplateParameterType() == TypeInfo.t_class ||
info.getTemplateParameterType() == TypeInfo.t_struct ||
info.getTemplateParameterType() == TypeInfo.t_union ||
info.getTemplateParameterType() == TypeInfo.t_enumeration ||
info.getTemplateParameterType() == TypeInfo.t_void )
{
return false;
}