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

Patch for Andrew Niefer.

This patch fixes the way the symbol table handles const & volatile.
It also fixes the following bugs:
47628 - signed char is parsed as char
47636 - char * and char[] are treated as different types
45697 - Parser/Symbol Table: Mismatched declarations & definition
This commit is contained in:
John Camelon 2004-02-13 15:40:08 +00:00
parent c2ba759a8c
commit b416d5f3b9
14 changed files with 414 additions and 227 deletions

View file

@ -1,3 +1,13 @@
2004-02-12 Andrew Niefer
UnCommented CompleteParseASTTest.testBug47628
Added CompleteParseASTTest.testBug47636
Added CompleteParseASTTest.testBug45697
Updated ParserSymbolTableTests & ParserSymbolTableTemplateTests for proper use of const & volatile
Added ParserSymbolTableTests.testbug47636FunctionParameterComparisons_1
Added ParserSymbolTableTests.testbug47636FunctionParameterComparisons_2
Added ParserSymbolTableTests.testbug47636FunctionParameterComparisons_3
Added ParserSymbolTableTests.testbug47636FunctionParameterComparisons_4
2004-02-11 John Camelon 2004-02-11 John Camelon
Updated tests to accommodate for new Parser class hierarchy and factories. Updated tests to accommodate for new Parser class hierarchy and factories.

View file

@ -1203,35 +1203,82 @@ public class CompleteParseASTTest extends CompleteParseBaseTest
assertAllReferences( 1, createTaskList( new Task( x ))); assertAllReferences( 1, createTaskList( new Task( x )));
} }
// public void testBug47628() throws Exception public void testBug47628() throws Exception
// { {
// Writer writer = new StringWriter(); Writer writer = new StringWriter();
// writer.write( "void h(char) { }\n"); writer.write( "void h(char) { }\n");
// writer.write( "void h(unsigned char) { }\n"); writer.write( "void h(unsigned char) { }\n");
// writer.write( "void h(signed char) { } // not shown in outline, parsed as char\n"); writer.write( "void h(signed char) { } // not shown in outline, parsed as char\n");
// Iterator i = parse( writer.toString() ).getDeclarations();
// IASTFunction h1 = (IASTFunction) i.next();
// assertEquals( h1.getName(), "h");
// Iterator parms = h1.getParameters();
// IASTParameterDeclaration parm = (IASTParameterDeclaration) parms.next();
// assertTrue( parm.getTypeSpecifier() instanceof IASTSimpleTypeSpecifier );
// assertEquals( ((IASTSimpleTypeSpecifier)parm.getTypeSpecifier()).getTypename(), "char" );
// IASTFunction h2 = (IASTFunction) i.next();
// assertEquals( h2.getName(), "h");
// parms = h2.getParameters();
// parm = (IASTParameterDeclaration) parms.next();
// assertTrue( parm.getTypeSpecifier() instanceof IASTSimpleTypeSpecifier );
// assertEquals( ((IASTSimpleTypeSpecifier)parm.getTypeSpecifier()).getTypename(), "unsigned char" );
//
// IASTFunction h3 = (IASTFunction) i.next();
// assertEquals( h3.getName(), "h");
// parms = h3.getParameters();
// parm = (IASTParameterDeclaration) parms.next();
// assertTrue( parm.getTypeSpecifier() instanceof IASTSimpleTypeSpecifier );
// assertEquals( ((IASTSimpleTypeSpecifier)parm.getTypeSpecifier()).getTypename(), "signed char" );
//
// assertFalse( i.hasNext() );
// }
Iterator i = parse( writer.toString() ).getDeclarations();
IASTFunction h1 = (IASTFunction) i.next();
assertEquals( h1.getName(), "h");
Iterator parms = h1.getParameters();
IASTParameterDeclaration parm = (IASTParameterDeclaration) parms.next();
assertTrue( parm.getTypeSpecifier() instanceof IASTSimpleTypeSpecifier );
assertEquals( ((IASTSimpleTypeSpecifier)parm.getTypeSpecifier()).getTypename(), "char" );
IASTFunction h2 = (IASTFunction) i.next();
assertEquals( h2.getName(), "h");
parms = h2.getParameters();
parm = (IASTParameterDeclaration) parms.next();
assertTrue( parm.getTypeSpecifier() instanceof IASTSimpleTypeSpecifier );
assertEquals( ((IASTSimpleTypeSpecifier)parm.getTypeSpecifier()).getTypename(), "unsigned char" );
IASTFunction h3 = (IASTFunction) i.next();
assertEquals( h3.getName(), "h");
parms = h3.getParameters();
parm = (IASTParameterDeclaration) parms.next();
assertTrue( parm.getTypeSpecifier() instanceof IASTSimpleTypeSpecifier );
assertEquals( ((IASTSimpleTypeSpecifier)parm.getTypeSpecifier()).getTypename(), "signed char" );
assertFalse( i.hasNext() );
}
public void testBug47636() throws Exception
{
Writer writer = new StringWriter();
writer.write( "void f( char [] ); \n" );
writer.write( "void f( char * ){} \n" );
Iterator i = parse( writer.toString() ).getDeclarations();
IASTFunction fDec = (IASTFunction) i.next();
assertEquals( fDec.getName(), "f");
IASTFunction fDef = (IASTFunction) i.next();
assertEquals( fDef.getName(), "f");
assertTrue( fDef.previouslyDeclared() );
assertFalse( i.hasNext() );
}
public void testBug45697() throws Exception
{
Writer writer = new StringWriter();
writer.write( " int f( bool ); \n");
writer.write( " int f( char ){ } ");
Iterator i = parse( writer.toString() ).getDeclarations();
IASTFunction f1 = (IASTFunction) i.next();
assertEquals( f1.getName(), "f");
Iterator parms = f1.getParameters();
IASTParameterDeclaration parm = (IASTParameterDeclaration) parms.next();
assertTrue( parm.getTypeSpecifier() instanceof IASTSimpleTypeSpecifier );
assertEquals( ((IASTSimpleTypeSpecifier)parm.getTypeSpecifier()).getTypename(), "bool" );
IASTFunction f2 = (IASTFunction) i.next();
assertEquals( f2.getName(), "f");
parms = f2.getParameters();
parm = (IASTParameterDeclaration) parms.next();
assertTrue( parm.getTypeSpecifier() instanceof IASTSimpleTypeSpecifier );
assertEquals( ((IASTSimpleTypeSpecifier)parm.getTypeSpecifier()).getTypename(), "char" );
assertFalse( f2.previouslyDeclared() );
assertFalse( i.hasNext() );
}
} }

View file

@ -275,7 +275,7 @@ public class ParserSymbolTableTemplateTests extends TestCase {
table.getCompilationUnit().addSymbol( f1 ); table.getCompilationUnit().addSymbol( f1 );
IParameterizedSymbol f2 = table.newParameterizedSymbol( "f", TypeInfo.t_function ); IParameterizedSymbol f2 = table.newParameterizedSymbol( "f", TypeInfo.t_function );
f2.addParameter( lookA, null, false ); f2.addParameter( lookA, 0, null, false );
table.getCompilationUnit().addSymbol( f2 ); table.getCompilationUnit().addSymbol( f2 );
IParameterizedSymbol f3 = table.newParameterizedSymbol( "f", TypeInfo.t_function ); IParameterizedSymbol f3 = table.newParameterizedSymbol( "f", TypeInfo.t_function );
@ -1060,7 +1060,7 @@ public class ParserSymbolTableTemplateTests extends TestCase {
IParameterizedSymbol compare = table.newParameterizedSymbol( "compare", TypeInfo.t_function ); IParameterizedSymbol compare = table.newParameterizedSymbol( "compare", TypeInfo.t_function );
compare.setIsForwardDeclaration( true ); compare.setIsForwardDeclaration( true );
compare.addParameter( T2, new PtrOp( PtrOp.t_reference, true, false ), false ); compare.addParameter( T2, 0, new PtrOp( PtrOp.t_reference, true, false ), false );
compare.setReturnType( T2 ); compare.setReturnType( T2 );
template2.addSymbol( compare ); template2.addSymbol( compare );
@ -1083,7 +1083,7 @@ public class ParserSymbolTableTemplateTests extends TestCase {
IParameterizedSymbol compareDef = table.newParameterizedSymbol( "compare", TypeInfo.t_function ); IParameterizedSymbol compareDef = table.newParameterizedSymbol( "compare", TypeInfo.t_function );
ISymbol look = factory.lookupParam( "V" ); ISymbol look = factory.lookupParam( "V" );
assertEquals( look, V ); assertEquals( look, V );
compareDef.addParameter( look, new PtrOp( PtrOp.t_reference, true, false ), false ); compareDef.addParameter( look, 0, new PtrOp( PtrOp.t_reference, true, false ), false );
compareDef.setReturnType( look ); compareDef.setReturnType( look );
compare.setTypeSymbol( compareDef ); compare.setTypeSymbol( compareDef );
factory.addSymbol( compareDef ); factory.addSymbol( compareDef );
@ -1142,7 +1142,7 @@ public class ParserSymbolTableTemplateTests extends TestCase {
memberTemplate.addTemplateParameter( C ); memberTemplate.addTemplateParameter( C );
IParameterizedSymbol g = table.newParameterizedSymbol( "g", TypeInfo.t_function ); IParameterizedSymbol g = table.newParameterizedSymbol( "g", TypeInfo.t_function );
g.addParameter( C, null, false ); g.addParameter( C, 0, null, false );
g.getTypeInfo().setBit( true, TypeInfo.isVirtual ); g.getTypeInfo().setBit( true, TypeInfo.isVirtual );
memberTemplate.addSymbol( g ); memberTemplate.addSymbol( g );
@ -1400,7 +1400,7 @@ public class ParserSymbolTableTemplateTests extends TestCase {
template1.addTemplateParameter( table.newSymbol( "T", TypeInfo.t_templateParameter ) ); template1.addTemplateParameter( table.newSymbol( "T", TypeInfo.t_templateParameter ) );
ISymbol T = template1.lookup( "T" ); ISymbol T = template1.lookup( "T" );
IParameterizedSymbol f1 = table.newParameterizedSymbol( "f", TypeInfo.t_function ); IParameterizedSymbol f1 = table.newParameterizedSymbol( "f", TypeInfo.t_function );
f1.addParameter( T, null, false ); f1.addParameter( T, 0, null, false );
template1.addSymbol( f1 ); template1.addSymbol( f1 );
table.getCompilationUnit().addSymbol( template1 ); table.getCompilationUnit().addSymbol( template1 );
@ -1408,7 +1408,7 @@ public class ParserSymbolTableTemplateTests extends TestCase {
template2.addTemplateParameter( table.newSymbol( "T", TypeInfo.t_templateParameter ) ); template2.addTemplateParameter( table.newSymbol( "T", TypeInfo.t_templateParameter ) );
T = template2.lookup( "T" ); T = template2.lookup( "T" );
IParameterizedSymbol f2 = table.newParameterizedSymbol( "f", TypeInfo.t_function ); IParameterizedSymbol f2 = table.newParameterizedSymbol( "f", TypeInfo.t_function );
f2.addParameter( T, new PtrOp( PtrOp.t_pointer ), false ); f2.addParameter( T, 0, new PtrOp( PtrOp.t_pointer ), false );
template2.addSymbol( f2 ); template2.addSymbol( f2 );
table.getCompilationUnit().addSymbol( template2 ); table.getCompilationUnit().addSymbol( template2 );
@ -1417,12 +1417,13 @@ public class ParserSymbolTableTemplateTests extends TestCase {
template3.addTemplateParameter( table.newSymbol( "T", TypeInfo.t_templateParameter ) ); template3.addTemplateParameter( table.newSymbol( "T", TypeInfo.t_templateParameter ) );
T = template3.lookup( "T" ); T = template3.lookup( "T" );
IParameterizedSymbol f3 = table.newParameterizedSymbol( "f", TypeInfo.t_function ); IParameterizedSymbol f3 = table.newParameterizedSymbol( "f", TypeInfo.t_function );
f3.addParameter( T, new PtrOp( PtrOp.t_pointer, true, false ), false ); f3.addParameter( T, TypeInfo.isConst, new PtrOp( PtrOp.t_pointer, false, false ), false );
template3.addSymbol( f3 ); template3.addSymbol( f3 );
table.getCompilationUnit().addSymbol( template3 ); table.getCompilationUnit().addSymbol( template3 );
ISymbol p = table.newSymbol( "p", TypeInfo.t_int ); ISymbol p = table.newSymbol( "p", TypeInfo.t_int );
p.addPtrOperator( new PtrOp( PtrOp.t_pointer, true, false ) ); p.getTypeInfo().setBit( true, TypeInfo.isConst );
p.addPtrOperator( new PtrOp( PtrOp.t_pointer, false, false ) );
table.getCompilationUnit().addSymbol( p ); table.getCompilationUnit().addSymbol( p );
List params = new LinkedList(); List params = new LinkedList();
@ -1449,7 +1450,7 @@ public class ParserSymbolTableTemplateTests extends TestCase {
template1.addTemplateParameter( table.newSymbol( "T", TypeInfo.t_templateParameter ) ); template1.addTemplateParameter( table.newSymbol( "T", TypeInfo.t_templateParameter ) );
ISymbol T = template1.lookup( "T" ); ISymbol T = template1.lookup( "T" );
IParameterizedSymbol g1 = table.newParameterizedSymbol( "g", TypeInfo.t_function ); IParameterizedSymbol g1 = table.newParameterizedSymbol( "g", TypeInfo.t_function );
g1.addParameter( T, null, false ); g1.addParameter( T, 0, null, false );
template1.addSymbol( g1 ); template1.addSymbol( g1 );
table.getCompilationUnit().addSymbol( template1 ); table.getCompilationUnit().addSymbol( template1 );
@ -1457,7 +1458,7 @@ public class ParserSymbolTableTemplateTests extends TestCase {
template2.addTemplateParameter( table.newSymbol( "T", TypeInfo.t_templateParameter ) ); template2.addTemplateParameter( table.newSymbol( "T", TypeInfo.t_templateParameter ) );
T = template2.lookup( "T" ); T = template2.lookup( "T" );
IParameterizedSymbol g2 = table.newParameterizedSymbol( "g", TypeInfo.t_function ); IParameterizedSymbol g2 = table.newParameterizedSymbol( "g", TypeInfo.t_function );
g2.addParameter( T, new PtrOp( PtrOp.t_reference ), false ); g2.addParameter( T, 0, new PtrOp( PtrOp.t_reference ), false );
template2.addSymbol( g2 ); template2.addSymbol( g2 );
table.getCompilationUnit().addSymbol( template2 ); table.getCompilationUnit().addSymbol( template2 );
@ -1465,7 +1466,7 @@ public class ParserSymbolTableTemplateTests extends TestCase {
List params = new LinkedList(); List params = new LinkedList();
params.add( new TypeInfo( TypeInfo.t_type, 0, x ) ); params.add( new TypeInfo( TypeInfo.t_type, 0, x ) );
try{ try{
ISymbol look = table.getCompilationUnit().unqualifiedFunctionLookup( "g", params ); table.getCompilationUnit().unqualifiedFunctionLookup( "g", params );
assertTrue( false ); assertTrue( false );
} catch( ParserSymbolTableException e ){ } catch( ParserSymbolTableException e ){
assertEquals( e.reason, ParserSymbolTableException.r_Ambiguous ); assertEquals( e.reason, ParserSymbolTableException.r_Ambiguous );
@ -1500,7 +1501,7 @@ public class ParserSymbolTableTemplateTests extends TestCase {
template1.addTemplateParameter( table.newSymbol( "T", TypeInfo.t_templateParameter ) ); template1.addTemplateParameter( table.newSymbol( "T", TypeInfo.t_templateParameter ) );
ISymbol T = template1.lookup( "T" ); ISymbol T = template1.lookup( "T" );
IParameterizedSymbol h1 = table.newParameterizedSymbol( "h", TypeInfo.t_function ); IParameterizedSymbol h1 = table.newParameterizedSymbol( "h", TypeInfo.t_function );
h1.addParameter( T, new PtrOp( PtrOp.t_reference, true, false ), false ); h1.addParameter( T, TypeInfo.isConst, new PtrOp( PtrOp.t_reference, false, false ),false );
template1.addSymbol( h1 ); template1.addSymbol( h1 );
table.getCompilationUnit().addSymbol( template1 ); table.getCompilationUnit().addSymbol( template1 );
@ -1511,7 +1512,7 @@ public class ParserSymbolTableTemplateTests extends TestCase {
IParameterizedSymbol h2 = table.newParameterizedSymbol( "h", TypeInfo.t_function ); IParameterizedSymbol h2 = table.newParameterizedSymbol( "h", TypeInfo.t_function );
List argList = new LinkedList(); List argList = new LinkedList();
argList.add( new TypeInfo( TypeInfo.t_type, 0, T ) ); argList.add( new TypeInfo( TypeInfo.t_type, 0, T ) );
h2.addParameter( templateA.instantiate( argList ), new PtrOp( PtrOp.t_reference ), false ); h2.addParameter( templateA.instantiate( argList ), 0, new PtrOp( PtrOp.t_reference ), false );
template2.addSymbol( h2 ); template2.addSymbol( h2 );
table.getCompilationUnit().addSymbol( template2 ); table.getCompilationUnit().addSymbol( template2 );
@ -1535,7 +1536,7 @@ public class ParserSymbolTableTemplateTests extends TestCase {
assertTrue( look.isTemplateInstance() ); assertTrue( look.isTemplateInstance() );
assertEquals( look.getInstantiatedSymbol(), A ); assertEquals( look.getInstantiatedSymbol(), A );
z2.setTypeSymbol( look ); z2.setTypeSymbol( look );
z2.addPtrOperator( new PtrOp( PtrOp.t_undef, true, false ) ); z2.getTypeInfo().setBit( true, TypeInfo.isConst );
params.clear(); params.clear();
params.add( new TypeInfo( TypeInfo.t_type, 0, z2 ) ); params.add( new TypeInfo( TypeInfo.t_type, 0, z2 ) );
@ -1789,12 +1790,12 @@ public class ParserSymbolTableTemplateTests extends TestCase {
ISymbol U = template.lookup( "U" ); ISymbol U = template.lookup( "U" );
paramFunction.setReturnType( T ); paramFunction.setReturnType( T );
paramFunction.addParameter( T, null, false ); paramFunction.addParameter( T, 0, null, false );
paramFunction.addParameter( U, null, false ); paramFunction.addParameter( U, 0, null, false );
paramFunction.addParameter( U, null, false ); paramFunction.addParameter( U, 0, null, false );
IParameterizedSymbol f = table.newParameterizedSymbol( "f", TypeInfo.t_function ); IParameterizedSymbol f = table.newParameterizedSymbol( "f", TypeInfo.t_function );
f.addParameter( paramFunction, null, false ); f.addParameter( paramFunction, 0, null, false );
template.addSymbol( f ); template.addSymbol( f );
@ -1857,7 +1858,7 @@ public class ParserSymbolTableTemplateTests extends TestCase {
template.addTemplateParameter( T ); template.addTemplateParameter( T );
IParameterizedSymbol f = table.newParameterizedSymbol( "f", TypeInfo.t_function ); IParameterizedSymbol f = table.newParameterizedSymbol( "f", TypeInfo.t_function );
f.addParameter( T, new PtrOp( PtrOp.t_pointer, true, false ), false ); f.addParameter( T, 0, new PtrOp( PtrOp.t_pointer, true, false ), false );
template.addSymbol( f ); template.addSymbol( f );
table.getCompilationUnit().addSymbol( template ); table.getCompilationUnit().addSymbol( template );

View file

@ -1188,10 +1188,9 @@ public class ParserSymbolTableTest extends TestCase {
IDerivableContainerSymbol cls = table.newDerivableContainerSymbol( "class", TypeInfo.t_class ); IDerivableContainerSymbol cls = table.newDerivableContainerSymbol( "class", TypeInfo.t_class );
IParameterizedSymbol fn = table.newParameterizedSymbol("function"); IParameterizedSymbol fn = table.newParameterizedSymbol("function", TypeInfo.t_function );
fn.setType( TypeInfo.t_function ); fn.setType( TypeInfo.t_function );
fn.getTypeInfo().addPtrOperator( new PtrOp( PtrOp.t_undef, true, false ) ); fn.getTypeInfo().setBit( true, TypeInfo.isConst );
//fn.setCVQualifier( ParserSymbolTable.TypeInfo.cvConst );
table.getCompilationUnit().addSymbol( cls ); table.getCompilationUnit().addSymbol( cls );
cls.addSymbol( fn ); cls.addSymbol( fn );
@ -1201,8 +1200,9 @@ public class ParserSymbolTableTest extends TestCase {
assertEquals( look.getType(), TypeInfo.t_type ); assertEquals( look.getType(), TypeInfo.t_type );
assertEquals( look.getTypeSymbol(), cls ); assertEquals( look.getTypeSymbol(), cls );
assertTrue( look.getTypeInfo().checkBit( TypeInfo.isConst ) );
assertEquals( ((PtrOp)look.getPtrOperators().iterator().next()).getType(), TypeInfo.PtrOp.t_pointer ); assertEquals( ((PtrOp)look.getPtrOperators().iterator().next()).getType(), TypeInfo.PtrOp.t_pointer );
assertTrue( ((PtrOp)look.getPtrOperators().iterator().next()).isConst() );
assertEquals( look.getContainingSymbol(), fn ); assertEquals( look.getContainingSymbol(), fn );
} }
@ -1270,7 +1270,7 @@ public class ParserSymbolTableTest extends TestCase {
ISymbol look = NS.lookup( "T" ); ISymbol look = NS.lookup( "T" );
assertEquals( look, T ); assertEquals( look, T );
f.addParameter( look, null, false ); f.addParameter( look, 0, null, false );
NS.addSymbol( f ); NS.addSymbol( f );
@ -1433,7 +1433,7 @@ public class ParserSymbolTableTest extends TestCase {
f3.setReturnType( table.newSymbol( "", TypeInfo.t_void ) ); f3.setReturnType( table.newSymbol( "", TypeInfo.t_void ) );
f3.addParameter( TypeInfo.t_int, 0, null, false ); f3.addParameter( TypeInfo.t_int, 0, null, false );
f3.addParameter( TypeInfo.t_char, 0, null, false ); f3.addParameter( TypeInfo.t_char, 0, null, false );
f3.addParameter( C, new PtrOp( PtrOp.t_pointer ), false ); f3.addParameter( C, 0, new PtrOp( PtrOp.t_pointer ), false );
C.addSymbol( f3 ); C.addSymbol( f3 );
ISymbol look = compUnit.lookup("C"); ISymbol look = compUnit.lookup("C");
@ -1556,12 +1556,12 @@ public class ParserSymbolTableTest extends TestCase {
IParameterizedSymbol f1 = table.newParameterizedSymbol( "f" ); IParameterizedSymbol f1 = table.newParameterizedSymbol( "f" );
f1.setType( TypeInfo.t_function ); f1.setType( TypeInfo.t_function );
f1.addParameter( A, new PtrOp( PtrOp.t_pointer ), false ); f1.addParameter( A, 0, new PtrOp( PtrOp.t_pointer ), false );
compUnit.addSymbol( f1 ); compUnit.addSymbol( f1 );
IParameterizedSymbol f2 = table.newParameterizedSymbol( "f" ); IParameterizedSymbol f2 = table.newParameterizedSymbol( "f" );
f2.setType( TypeInfo.t_function ); f2.setType( TypeInfo.t_function );
f2.addParameter( B, new PtrOp( PtrOp.t_pointer ), false ); f2.addParameter( B, 0, new PtrOp( PtrOp.t_pointer ), false );
compUnit.addSymbol( f2 ); compUnit.addSymbol( f2 );
ISymbol a = table.newSymbol( "a" ); ISymbol a = table.newSymbol( "a" );
@ -1625,12 +1625,12 @@ public class ParserSymbolTableTest extends TestCase {
IParameterizedSymbol f1 = table.newParameterizedSymbol( "f" ); IParameterizedSymbol f1 = table.newParameterizedSymbol( "f" );
f1.setType( TypeInfo.t_function ); f1.setType( TypeInfo.t_function );
f1.addParameter( A, new PtrOp( PtrOp.t_pointer ), false ); f1.addParameter( A, 0, new PtrOp( PtrOp.t_pointer ), false );
compUnit.addSymbol( f1 ); compUnit.addSymbol( f1 );
IParameterizedSymbol f2 = table.newParameterizedSymbol( "f" ); IParameterizedSymbol f2 = table.newParameterizedSymbol( "f" );
f2.setType( TypeInfo.t_function ); f2.setType( TypeInfo.t_function );
f2.addParameter( A, null, false ); f2.addParameter( A, 0, null, false );
compUnit.addSymbol( f2 ); compUnit.addSymbol( f2 );
ISymbol a = table.newSymbol( "a" ); ISymbol a = table.newSymbol( "a" );
@ -1706,12 +1706,12 @@ public class ParserSymbolTableTest extends TestCase {
IParameterizedSymbol constructor = table.newParameterizedSymbol("B"); IParameterizedSymbol constructor = table.newParameterizedSymbol("B");
constructor.setType( TypeInfo.t_constructor ); constructor.setType( TypeInfo.t_constructor );
constructor.addParameter( A, null, false ); constructor.addParameter( A, 0, null, false );
B.addConstructor( constructor ); B.addConstructor( constructor );
IParameterizedSymbol f = table.newParameterizedSymbol( "f" ); IParameterizedSymbol f = table.newParameterizedSymbol( "f" );
f.setType( TypeInfo.t_function ); f.setType( TypeInfo.t_function );
f.addParameter( B, null, false ); f.addParameter( B, 0, null, false );
compUnit.addSymbol( f ); compUnit.addSymbol( f );
ISymbol a = table.newSymbol( "a" ); ISymbol a = table.newSymbol( "a" );
@ -1744,7 +1744,7 @@ public class ParserSymbolTableTest extends TestCase {
* //and 1L->short and 1L->int are indistinguishable * //and 1L->short and 1L->int are indistinguishable
* f( &i, 'c' ); //calls f( int*, int) because &i->int * is better than &i->const int * * f( &i, 'c' ); //calls f( int*, int) because &i->int * is better than &i->const int *
* //and c->int is better than c->short * //and c->int is better than c->short
* f( (const)&i, 1L ); //calls f(const int *, short ) because const &i->int* is better than &i->int * * f( (const int *)&i, 1L ); //calls f(const int *, short ) because const &i->int* is better than &i->int *
* //and 1L->short and 1L->int are indistinguishable * //and 1L->short and 1L->int are indistinguishable
* } * }
*/ */
@ -1755,7 +1755,7 @@ public class ParserSymbolTableTest extends TestCase {
IParameterizedSymbol f1 = table.newParameterizedSymbol( "f" ); IParameterizedSymbol f1 = table.newParameterizedSymbol( "f" );
f1.setType( TypeInfo.t_function ); f1.setType( TypeInfo.t_function );
f1.addParameter( TypeInfo.t_int, 0, new PtrOp( PtrOp.t_pointer, true, false ), false ); f1.addParameter( TypeInfo.t_int, TypeInfo.isConst, new PtrOp( PtrOp.t_pointer, false, false ), false );
f1.addParameter( TypeInfo.t_int, TypeInfo.isShort, null, false ); f1.addParameter( TypeInfo.t_int, TypeInfo.isShort, null, false );
compUnit.addSymbol( f1 ); compUnit.addSymbol( f1 );
@ -1810,13 +1810,12 @@ public class ParserSymbolTableTest extends TestCase {
assertEquals( look, f2 ); assertEquals( look, f2 );
params.clear(); params.clear();
p1.addPtrOperator( new PtrOp( PtrOp.t_undef, true, false ) ); p1 = new TypeInfo( TypeInfo.t_int, TypeInfo.isConst, null, new PtrOp( PtrOp.t_pointer, false, false ), false );
//((PtrOp)p1.getPtrOperators().iterator().next()).setConst( true );
params.add( p1 ); params.add( p1 );
params.add( p3 ); params.add( p3 );
look = main.unqualifiedFunctionLookup( "f", params ); look = main.unqualifiedFunctionLookup( "f", params );
assertEquals( look, f1 ); assertEquals( look, f1 );
} }
/** /**
@ -1859,7 +1858,7 @@ public class ParserSymbolTableTest extends TestCase {
IParameterizedSymbol constructA = table.newParameterizedSymbol( "A" ); IParameterizedSymbol constructA = table.newParameterizedSymbol( "A" );
constructA.setType( TypeInfo.t_constructor ); constructA.setType( TypeInfo.t_constructor );
constructA.addParameter( B, new PtrOp( PtrOp.t_reference ), false ); constructA.addParameter( B, 0, new PtrOp( PtrOp.t_reference ), false );
A.addConstructor( constructA ); A.addConstructor( constructA );
IParameterizedSymbol operator = table.newParameterizedSymbol( "operator A" ); IParameterizedSymbol operator = table.newParameterizedSymbol( "operator A" );
@ -1868,7 +1867,7 @@ public class ParserSymbolTableTest extends TestCase {
IParameterizedSymbol f1 = table.newParameterizedSymbol( "f" ); IParameterizedSymbol f1 = table.newParameterizedSymbol( "f" );
f1.setType( TypeInfo.t_function ); f1.setType( TypeInfo.t_function );
f1.addParameter( A, null, false ); f1.addParameter( A, 0, null, false );
compUnit.addSymbol( f1 ); compUnit.addSymbol( f1 );
ISymbol b = table.newSymbol( "b" ); ISymbol b = table.newSymbol( "b" );
@ -1894,12 +1893,12 @@ public class ParserSymbolTableTest extends TestCase {
IParameterizedSymbol constructC = table.newParameterizedSymbol("C"); IParameterizedSymbol constructC = table.newParameterizedSymbol("C");
constructC.setType( TypeInfo.t_constructor ); constructC.setType( TypeInfo.t_constructor );
constructC.addParameter( B, new PtrOp( PtrOp.t_reference ), false ); constructC.addParameter( B, 0, new PtrOp( PtrOp.t_reference ), false );
C.addConstructor( constructC ); C.addConstructor( constructC );
IParameterizedSymbol f2 = table.newParameterizedSymbol( "f" ); IParameterizedSymbol f2 = table.newParameterizedSymbol( "f" );
f2.setType( TypeInfo.t_function ); f2.setType( TypeInfo.t_function );
f2.addParameter( C, null, false ); f2.addParameter( C, 0, null, false );
compUnit.addSymbol( f2 ); compUnit.addSymbol( f2 );
try{ try{
@ -1911,7 +1910,7 @@ public class ParserSymbolTableTest extends TestCase {
IParameterizedSymbol f3 = table.newParameterizedSymbol( "f" ); IParameterizedSymbol f3 = table.newParameterizedSymbol( "f" );
f3.setType( TypeInfo.t_function ); f3.setType( TypeInfo.t_function );
f3.addParameter( B, null, false ); f3.addParameter( B, 0, null, false );
compUnit.addSymbol( f3 ); compUnit.addSymbol( f3 );
look = compUnit.unqualifiedFunctionLookup( "f", params ); look = compUnit.unqualifiedFunctionLookup( "f", params );
@ -2056,7 +2055,7 @@ public class ParserSymbolTableTest extends TestCase {
IParameterizedSymbol fn1 = table.newParameterizedSymbol( "f", TypeInfo.t_function ); IParameterizedSymbol fn1 = table.newParameterizedSymbol( "f", TypeInfo.t_function );
ISymbol lookup = table.getCompilationUnit().lookup( "A" ); ISymbol lookup = table.getCompilationUnit().lookup( "A" );
assertEquals( lookup, forwardSymbol ); assertEquals( lookup, forwardSymbol );
fn1.addParameter( lookup, new PtrOp( PtrOp.t_pointer ), false ); fn1.addParameter( lookup, 0, new PtrOp( PtrOp.t_pointer ), false );
fn1.getTypeInfo().setBit( true, TypeInfo.isStatic ); fn1.getTypeInfo().setBit( true, TypeInfo.isStatic );
classB.addSymbol( fn1 ); classB.addSymbol( fn1 );
@ -2115,7 +2114,7 @@ public class ParserSymbolTableTest extends TestCase {
IDerivableContainerSymbol classA = table.newDerivableContainerSymbol( "A", TypeInfo.t_class ); IDerivableContainerSymbol classA = table.newDerivableContainerSymbol( "A", TypeInfo.t_class );
IParameterizedSymbol constructor1 = table.newParameterizedSymbol( "A", TypeInfo.t_constructor ); IParameterizedSymbol constructor1 = table.newParameterizedSymbol( "A", TypeInfo.t_constructor );
constructor1.addParameter( classA, new PtrOp( PtrOp.t_reference ), false ); constructor1.addParameter( classA, 0, new PtrOp( PtrOp.t_reference ), false );
IParameterizedSymbol constructor2 = table.newParameterizedSymbol( "A", TypeInfo.t_constructor ); IParameterizedSymbol constructor2 = table.newParameterizedSymbol( "A", TypeInfo.t_constructor );
constructor2.addParameter( TypeInfo.t_int, 0, null, false ); constructor2.addParameter( TypeInfo.t_int, 0, null, false );
@ -2234,7 +2233,7 @@ public class ParserSymbolTableTest extends TestCase {
IDerivableContainerSymbol a = table.newDerivableContainerSymbol( "A", TypeInfo.t_class ); IDerivableContainerSymbol a = table.newDerivableContainerSymbol( "A", TypeInfo.t_class );
table.getCompilationUnit().addSymbol( a ); table.getCompilationUnit().addSymbol( a );
f.addParameter( a, null, false ); f.addParameter( a, 0, null, false );
table.getCompilationUnit().addSymbol( f ); table.getCompilationUnit().addSymbol( f );
@ -2313,11 +2312,11 @@ public class ParserSymbolTableTest extends TestCase {
assertEquals( returned, null ); assertEquals( returned, null );
IParameterizedSymbol constructorA = table.newParameterizedSymbol( "A", TypeInfo.t_constructor ); IParameterizedSymbol constructorA = table.newParameterizedSymbol( "A", TypeInfo.t_constructor );
constructorA.addParameter( clsC, null, false ); constructorA.addParameter( clsC, 0, null, false );
clsA.addConstructor( constructorA ); clsA.addConstructor( constructorA );
IParameterizedSymbol constructorC = table.newParameterizedSymbol( "C", TypeInfo.t_constructor ); IParameterizedSymbol constructorC = table.newParameterizedSymbol( "C", TypeInfo.t_constructor );
constructorC.addParameter( clsA, null, false ); constructorC.addParameter( clsA, 0, null, false );
clsC.addConstructor( constructorC ); clsC.addConstructor( constructorC );
secondOp.getOperatorExpressions().clear(); secondOp.getOperatorExpressions().clear();
@ -2369,7 +2368,7 @@ public class ParserSymbolTableTest extends TestCase {
table.getCompilationUnit().addSymbol( c ); table.getCompilationUnit().addSymbol( c );
IParameterizedSymbol f1 = table.newParameterizedSymbol( "f", TypeInfo.t_function ); IParameterizedSymbol f1 = table.newParameterizedSymbol( "f", TypeInfo.t_function );
f1.addParameter( clsA, new PtrOp( PtrOp.t_reference ), false ); f1.addParameter( clsA, 0, new PtrOp( PtrOp.t_reference ), false );
table.getCompilationUnit().addSymbol( f1 ); table.getCompilationUnit().addSymbol( f1 );
LinkedList parameters = new LinkedList(); LinkedList parameters = new LinkedList();
@ -2380,7 +2379,7 @@ public class ParserSymbolTableTest extends TestCase {
assertEquals( look, f1 ); assertEquals( look, f1 );
IParameterizedSymbol f2 = table.newParameterizedSymbol( "f", TypeInfo.t_function ); IParameterizedSymbol f2 = table.newParameterizedSymbol( "f", TypeInfo.t_function );
f2.addParameter( clsB, new PtrOp( PtrOp.t_reference ), false ); f2.addParameter( clsB, 0, new PtrOp( PtrOp.t_reference ), false );
table.getCompilationUnit().addSymbol( f2 ); table.getCompilationUnit().addSymbol( f2 );
look = table.getCompilationUnit().unqualifiedFunctionLookup( "f", parameters ); look = table.getCompilationUnit().unqualifiedFunctionLookup( "f", parameters );
@ -3281,5 +3280,80 @@ public class ParserSymbolTableTest extends TestCase {
assertEquals( look, f ); assertEquals( look, f );
} }
/**
* typedef int Int;
* void f( int i );
* void f( Int i );
*
*
* @throws Exception
*/
public void testBug47636FunctionParameterComparisons_1() throws Exception{
newTable();
ISymbol Int = table.newSymbol( "Int", TypeInfo.t_type );
Int.getTypeInfo().setBit( true, TypeInfo.isTypedef );
Int.setTypeSymbol( table.newSymbol( ParserSymbolTable.EMPTY_NAME, TypeInfo.t_int ) );
IParameterizedSymbol f1 = table.newParameterizedSymbol( "f", TypeInfo.t_function );
f1.addParameter( TypeInfo.t_int, 0, null, false );
IParameterizedSymbol f2 = table.newParameterizedSymbol( "f", TypeInfo.t_function );
f2.addParameter( Int, 0, null, false );
assertTrue( f1.hasSameParameters( f2 ) );
}
/**
* void g( char * );
* void g( char [] );
*/
public void testBug47636FunctionParameterComparisons_2() throws Exception{
newTable();
IParameterizedSymbol g1 = table.newParameterizedSymbol( "g", TypeInfo.t_function );
g1.addParameter( TypeInfo.t_char, 0, new PtrOp( PtrOp.t_pointer ), false );
IParameterizedSymbol g2 = table.newParameterizedSymbol( "g", TypeInfo.t_function );
g2.addParameter( TypeInfo.t_char, 0, new PtrOp( PtrOp.t_array ), false );
assertTrue( g1.hasSameParameters( g2 ) );
}
/**
* void h( int() );
* void h( int (*) () );
*/
public void testBug47636FunctionParameterComparisons_3() throws Exception{
newTable();
IParameterizedSymbol f = table.newParameterizedSymbol( ParserSymbolTable.EMPTY_NAME, TypeInfo.t_function );
f.setReturnType( table.newSymbol( ParserSymbolTable.EMPTY_NAME, TypeInfo.t_int ) );
IParameterizedSymbol h1 = table.newParameterizedSymbol( "h", TypeInfo.t_function );
h1.addParameter( f, 0, null, false );
IParameterizedSymbol h2 = table.newParameterizedSymbol( "h", TypeInfo.t_function );
h2.addParameter( f, 0, new PtrOp( PtrOp.t_pointer ), false );
assertTrue( h1.hasSameParameters( h2 ) );
}
/**
* f( int );
* f( const int );
*/
public void testBug47636FunctionParameterComparisons_4() throws Exception{
newTable();
IParameterizedSymbol f1 = table.newParameterizedSymbol( "f", TypeInfo.t_function );
f1.addParameter( TypeInfo.t_int, 0, null, false );
IParameterizedSymbol f2 = table.newParameterizedSymbol( "f", TypeInfo.t_function );
f2.addParameter( TypeInfo.t_int, TypeInfo.isConst, null, false );
assertTrue( f1.hasSameParameters( f2 ) );
}
} }

View file

@ -1,3 +1,9 @@
2004-02-12 Andrew Niefer
Fixed up symbol table handling of const & volatile
fixed bug 47628 - signed char is parsed as char
fixed bug 47636 - char* and char[] are treated as different types
fixed bug 45697 - Parser/Symbol table: Mismatched declaration & definition
2004-02-12 John Camelon 2004-02-12 John Camelon
Removed IASTCompletionKind.SCOPED_REFERENCE as it was obsolete. Removed IASTCompletionKind.SCOPED_REFERENCE as it was obsolete.
Did preliminary work to support content assist within qualified names. Did preliminary work to support content assist within qualified names.

View file

@ -94,7 +94,7 @@ public class ASTSimpleTypeSpecifier extends ASTNode implements IASTSimpleTypeSpe
*/ */
public boolean isSigned() public boolean isSigned()
{ {
return ! symbol.getTypeInfo().checkBit( TypeInfo.isUnsigned); return symbol.getTypeInfo().checkBit( TypeInfo.isSigned);
} }
/* (non-Javadoc) /* (non-Javadoc)
* @see org.eclipse.cdt.core.parser.ast.IASTSimpleTypeSpecifier#isUnsigned() * @see org.eclipse.cdt.core.parser.ast.IASTSimpleTypeSpecifier#isUnsigned()

View file

@ -29,6 +29,7 @@ import org.eclipse.cdt.core.parser.ast.ASTSemanticException;
import org.eclipse.cdt.core.parser.ast.IASTASMDefinition; import org.eclipse.cdt.core.parser.ast.IASTASMDefinition;
import org.eclipse.cdt.core.parser.ast.IASTAbstractDeclaration; import org.eclipse.cdt.core.parser.ast.IASTAbstractDeclaration;
import org.eclipse.cdt.core.parser.ast.IASTAbstractTypeSpecifierDeclaration; import org.eclipse.cdt.core.parser.ast.IASTAbstractTypeSpecifierDeclaration;
import org.eclipse.cdt.core.parser.ast.IASTArrayModifier;
import org.eclipse.cdt.core.parser.ast.IASTClassSpecifier; import org.eclipse.cdt.core.parser.ast.IASTClassSpecifier;
import org.eclipse.cdt.core.parser.ast.IASTCodeScope; import org.eclipse.cdt.core.parser.ast.IASTCodeScope;
import org.eclipse.cdt.core.parser.ast.IASTCompilationUnit; import org.eclipse.cdt.core.parser.ast.IASTCompilationUnit;
@ -1590,6 +1591,7 @@ public class CompleteParseASTFactory extends BaseASTFactory implements IASTFacto
s.getTypeInfo().setBit( isUnsigned, TypeInfo.isUnsigned ); s.getTypeInfo().setBit( isUnsigned, TypeInfo.isUnsigned );
s.getTypeInfo().setBit( isComplex, TypeInfo.isComplex ); s.getTypeInfo().setBit( isComplex, TypeInfo.isComplex );
s.getTypeInfo().setBit( isImaginary, TypeInfo.isImaginary ); s.getTypeInfo().setBit( isImaginary, TypeInfo.isImaginary );
s.getTypeInfo().setBit( isSigned, TypeInfo.isSigned );
return new ASTSimpleTypeSpecifier( s, false, typeName.toString(), references ); return new ASTSimpleTypeSpecifier( s, false, typeName.toString(), references );
@ -1675,8 +1677,7 @@ public class CompleteParseASTFactory extends BaseASTFactory implements IASTFacto
symbol.setIsForwardDeclaration(!isFunctionDefinition); symbol.setIsForwardDeclaration(!isFunctionDefinition);
boolean previouslyDeclared = false; boolean previouslyDeclared = false;
if( isFunctionDefinition )
{
List functionParameters = new LinkedList(); List functionParameters = new LinkedList();
// the lookup requires a list of type infos // the lookup requires a list of type infos
// instead of a list of IASTParameterDeclaration // instead of a list of IASTParameterDeclaration
@ -1689,15 +1690,17 @@ public class CompleteParseASTFactory extends BaseASTFactory implements IASTFacto
IParameterizedSymbol functionDeclaration = null; IParameterizedSymbol functionDeclaration = null;
functionDeclaration = functionDeclaration =
(IParameterizedSymbol) lookupQualifiedName(ownerScope, name.getLastToken().getImage(), TypeInfo.t_function, functionParameters, 0, new ArrayList(), false, LookupType.UNQUALIFIED ); (IParameterizedSymbol) lookupQualifiedName(ownerScope, name.getLastToken().getImage(), TypeInfo.t_function, functionParameters, 0, new ArrayList(), false, LookupType.FORDEFINITION );
if( functionDeclaration != null ) if( functionDeclaration != null ){
{
functionDeclaration.setTypeSymbol( symbol );
previouslyDeclared = true; previouslyDeclared = true;
if( isFunctionDefinition ){
functionDeclaration.setTypeSymbol( symbol );
} }
} }
if( previouslyDeclared == false || isFunctionDefinition ){
try try
{ {
ownerScope.addSymbol( symbol ); ownerScope.addSymbol( symbol );
@ -1706,6 +1709,10 @@ public class CompleteParseASTFactory extends BaseASTFactory implements IASTFacto
{ {
throw new ASTSemanticException(); throw new ASTSemanticException();
} }
} else {
symbol = functionDeclaration;
}
ASTFunction function = new ASTFunction( symbol, nameEndOffset, parameters, returnType, exception, startOffset, startLine, nameOffset, nameLine, ownerTemplate, references, previouslyDeclared, hasFunctionTryBlock ); ASTFunction function = new ASTFunction( symbol, nameEndOffset, parameters, returnType, exception, startOffset, startLine, nameOffset, nameLine, ownerTemplate, references, previouslyDeclared, hasFunctionTryBlock );
try try
{ {
@ -1823,6 +1830,7 @@ public class CompleteParseASTFactory extends BaseASTFactory implements IASTFacto
ISymbol xrefSymbol = null; ISymbol xrefSymbol = null;
List newReferences = null; List newReferences = null;
int infoBits = 0;
if( absDecl.getTypeSpecifier() instanceof IASTSimpleTypeSpecifier ) if( absDecl.getTypeSpecifier() instanceof IASTSimpleTypeSpecifier )
{ {
if( ((IASTSimpleTypeSpecifier)absDecl.getTypeSpecifier()).getType() == IASTSimpleTypeSpecifier.Type.CLASS_OR_TYPENAME ) if( ((IASTSimpleTypeSpecifier)absDecl.getTypeSpecifier()).getType() == IASTSimpleTypeSpecifier.Type.CLASS_OR_TYPENAME )
@ -1830,6 +1838,8 @@ public class CompleteParseASTFactory extends BaseASTFactory implements IASTFacto
xrefSymbol = ((ASTSimpleTypeSpecifier)absDecl.getTypeSpecifier()).getSymbol(); xrefSymbol = ((ASTSimpleTypeSpecifier)absDecl.getTypeSpecifier()).getSymbol();
newReferences = ((ASTSimpleTypeSpecifier)absDecl.getTypeSpecifier()).getReferences(); newReferences = ((ASTSimpleTypeSpecifier)absDecl.getTypeSpecifier()).getReferences();
} }
infoBits = ((ASTSimpleTypeSpecifier)absDecl.getTypeSpecifier()).getSymbol().getTypeInfo().getTypeInfo();
} }
else if( absDecl.getTypeSpecifier() instanceof ASTElaboratedTypeSpecifier ) else if( absDecl.getTypeSpecifier() instanceof ASTElaboratedTypeSpecifier )
{ {
@ -1849,6 +1859,10 @@ public class CompleteParseASTFactory extends BaseASTFactory implements IASTFacto
if( xrefSymbol != null ) if( xrefSymbol != null )
paramSymbol.setTypeSymbol( xrefSymbol.getTypeSymbol() ); paramSymbol.setTypeSymbol( xrefSymbol.getTypeSymbol() );
paramSymbol.getTypeInfo().setTypeInfo( infoBits );
paramSymbol.getTypeInfo().setBit( absDecl.isConst(), TypeInfo.isConst );
paramSymbol.getTypeInfo().setBit( absDecl.isVolatile(), TypeInfo.isVolatile );
setPointerOperators( paramSymbol, absDecl.getPointerOperators(), absDecl.getArrayModifiers() ); setPointerOperators( paramSymbol, absDecl.getPointerOperators(), absDecl.getArrayModifiers() );
if( isParameter) if( isParameter)
@ -2317,6 +2331,7 @@ public class CompleteParseASTFactory extends BaseASTFactory implements IASTFacto
newSymbol.getTypeInfo().setBit( isRegister, TypeInfo.isRegister ); newSymbol.getTypeInfo().setBit( isRegister, TypeInfo.isRegister );
newSymbol.getTypeInfo().setBit( isStatic, TypeInfo.isStatic ); newSymbol.getTypeInfo().setBit( isStatic, TypeInfo.isStatic );
newSymbol.getTypeInfo().setBit( abstractDeclaration.isConst(), TypeInfo.isConst ); newSymbol.getTypeInfo().setBit( abstractDeclaration.isConst(), TypeInfo.isConst );
newSymbol.getTypeInfo().setBit( abstractDeclaration.isVolatile(), TypeInfo.isVolatile );
} }
protected ISymbol cloneSimpleTypeSymbol( protected ISymbol cloneSimpleTypeSymbol(
@ -2779,6 +2794,7 @@ public class CompleteParseASTFactory extends BaseASTFactory implements IASTFacto
result.getTypeInfo().setBit( id.isShort(), TypeInfo.isShort); result.getTypeInfo().setBit( id.isShort(), TypeInfo.isShort);
result.getTypeInfo().setBit( id.isLong(), TypeInfo.isLong); result.getTypeInfo().setBit( id.isLong(), TypeInfo.isLong);
result.getTypeInfo().setBit( id.isUnsigned(), TypeInfo.isUnsigned); result.getTypeInfo().setBit( id.isUnsigned(), TypeInfo.isUnsigned);
result.getTypeInfo().setBit( id.isSigned(), TypeInfo.isSigned );
List refs = new ArrayList(); List refs = new ArrayList();
if( result.getType() == TypeInfo.t_type ) if( result.getType() == TypeInfo.t_type )

View file

@ -444,6 +444,7 @@ public class ContainerSymbol extends BasicSymbol implements IContainerSymbol {
LookupData data = new LookupData( name, TypeInfo.t_any ); LookupData data = new LookupData( name, TypeInfo.t_any );
data.qualified = true; data.qualified = true;
data.parameters = ( parameters == null ) ? new LinkedList() : parameters; data.parameters = ( parameters == null ) ? new LinkedList() : parameters;
data.exactFunctionsOnly = true;
IContainerSymbol container = this; IContainerSymbol container = this;

View file

@ -170,14 +170,15 @@ public class DerivableContainerSymbol extends ContainerSymbol implements IDeriva
public void addCopyConstructor() throws ParserSymbolTableException{ public void addCopyConstructor() throws ParserSymbolTableException{
List parameters = new LinkedList(); List parameters = new LinkedList();
TypeInfo param = new TypeInfo( TypeInfo.t_type, 0, this, new TypeInfo.PtrOp( TypeInfo.PtrOp.t_reference, true, false ), false ); TypeInfo param = new TypeInfo( TypeInfo.t_type, TypeInfo.isConst, this, new TypeInfo.PtrOp( TypeInfo.PtrOp.t_reference, false, false ), false );
parameters.add( param ); parameters.add( param );
IParameterizedSymbol constructor = lookupConstructor( parameters ); IParameterizedSymbol constructor = lookupConstructor( parameters );
if( constructor == null ){ if( constructor == null ){
constructor = getSymbolTable().newParameterizedSymbol( getName(), TypeInfo.t_constructor ); constructor = getSymbolTable().newParameterizedSymbol( getName(), TypeInfo.t_constructor );
constructor.addParameter( this, new TypeInfo.PtrOp( TypeInfo.PtrOp.t_reference, true, false ), false ); constructor.addParameter( this, TypeInfo.isConst, new TypeInfo.PtrOp( TypeInfo.PtrOp.t_reference, false, false ), false );
addConstructor( constructor ); addConstructor( constructor );
} }
} }
@ -248,10 +249,8 @@ public class DerivableContainerSymbol extends ContainerSymbol implements IDeriva
//thisObj.setCVQualifier( obj.getCVQualifier() ); //thisObj.setCVQualifier( obj.getCVQualifier() );
TypeInfo.PtrOp ptr = new TypeInfo.PtrOp(); TypeInfo.PtrOp ptr = new TypeInfo.PtrOp();
ptr.setType( TypeInfo.PtrOp.t_pointer ); ptr.setType( TypeInfo.PtrOp.t_pointer );
if( obj.getTypeInfo().hasPtrOperators() ){ thisObj.getTypeInfo().setBit( obj.getTypeInfo().checkBit( TypeInfo.isConst ), TypeInfo.isConst );
ptr.setConst( ((TypeInfo.PtrOp) obj.getPtrOperators().iterator().next()).isConst() ); thisObj.getTypeInfo().setBit( obj.getTypeInfo().checkBit( TypeInfo.isVolatile ), TypeInfo.isVolatile );
ptr.setVolatile( ((TypeInfo.PtrOp) obj.getPtrOperators().iterator().next()).isVolatile() );
}
thisObj.addPtrOperator(ptr); thisObj.addPtrOperator(ptr);

View file

@ -30,7 +30,7 @@ public interface IParameterizedSymbol extends IContainerSymbol {
public void addParameter( ISymbol param ); public void addParameter( ISymbol param );
public void addParameter( TypeInfo.eType type, int info, TypeInfo.PtrOp ptrOp, boolean hasDefault ); public void addParameter( TypeInfo.eType type, int info, TypeInfo.PtrOp ptrOp, boolean hasDefault );
public void addParameter( ISymbol typeSymbol, TypeInfo.PtrOp ptrOp, boolean hasDefault ); public void addParameter( ISymbol typeSymbol, int info, TypeInfo.PtrOp ptrOp, boolean hasDefault );
public Map getParameterMap(); public Map getParameterMap();
public List getParameterList(); public List getParameterList();

View file

@ -17,11 +17,13 @@ import java.util.HashMap;
import java.util.Iterator; import java.util.Iterator;
import java.util.LinkedList; import java.util.LinkedList;
import java.util.List; import java.util.List;
import java.util.ListIterator;
import java.util.Map; import java.util.Map;
import java.util.TreeMap; import java.util.TreeMap;
import org.eclipse.cdt.core.parser.ParserMode; import org.eclipse.cdt.core.parser.ParserMode;
import org.eclipse.cdt.internal.core.parser.pst.ParserSymbolTable.Command; import org.eclipse.cdt.internal.core.parser.pst.ParserSymbolTable.Command;
import org.eclipse.cdt.internal.core.parser.pst.TypeInfo.PtrOp;
/** /**
* @author aniefer * @author aniefer
@ -137,14 +139,15 @@ public class ParameterizedSymbol extends ContainerSymbol implements IParameteriz
/* (non-Javadoc) /* (non-Javadoc)
* @see org.eclipse.cdt.internal.core.parser.pst.IParameterizedSymbol#addParameter(org.eclipse.cdt.internal.core.parser.pst.ISymbol, org.eclipse.cdt.internal.core.parser.pst.TypeInfo.PtrOp, boolean) * @see org.eclipse.cdt.internal.core.parser.pst.IParameterizedSymbol#addParameter(org.eclipse.cdt.internal.core.parser.pst.ISymbol, org.eclipse.cdt.internal.core.parser.pst.TypeInfo.PtrOp, boolean)
*/ */
public void addParameter( ISymbol typeSymbol, TypeInfo.PtrOp ptrOp, boolean hasDefault ){ public void addParameter( ISymbol typeSymbol, int info, TypeInfo.PtrOp ptrOp, boolean hasDefault ){
BasicSymbol param = new BasicSymbol(getSymbolTable(), ParserSymbolTable.EMPTY_NAME); BasicSymbol param = new BasicSymbol(getSymbolTable(), ParserSymbolTable.EMPTY_NAME);
TypeInfo info = param.getTypeInfo(); TypeInfo nfo = param.getTypeInfo();
info.setType( TypeInfo.t_type ); nfo.setTypeInfo( info );
info.setTypeSymbol( typeSymbol ); nfo.setType( TypeInfo.t_type );
info.addPtrOperator( ptrOp ); nfo.setTypeSymbol( typeSymbol );
info.setHasDefault( hasDefault ); nfo.addPtrOperator( ptrOp );
nfo.setHasDefault( hasDefault );
addParameter( param ); addParameter( param );
} }
@ -205,6 +208,43 @@ public class ParameterizedSymbol extends ContainerSymbol implements IParameteriz
info = ((BasicSymbol)iter.next()).getTypeInfo(); info = ((BasicSymbol)iter.next()).getTypeInfo();
fInfo = ((BasicSymbol) fIter.next()).getTypeInfo(); fInfo = ((BasicSymbol) fIter.next()).getTypeInfo();
//parameters that differ only in the use of equivalent typedef types are equivalent.
info = ParserSymbolTable.getFlatTypeInfo( info );
fInfo = ParserSymbolTable.getFlatTypeInfo( fInfo );
for( TypeInfo nfo = info; nfo != null; nfo = fInfo ){
//an array declaration is adjusted to become a pointer declaration
//only the second and subsequent array dimensions are significant in parameter types
ListIterator ptrs = nfo.getPtrOperators().listIterator();
if( ptrs.hasNext() ){
PtrOp op = (PtrOp) ptrs.next();
if( op.getType() == PtrOp.t_array ){
ptrs.remove();
ptrs.add( new PtrOp( PtrOp.t_pointer, op.isConst(), op.isVolatile() ) );
}
}
//a function type is adjusted to become a pointer to function type
if( nfo.isType( TypeInfo.t_type ) && nfo.getTypeSymbol().isType( TypeInfo.t_function ) ){
if( nfo.getPtrOperators().size() == 0 ){
nfo.addPtrOperator( new PtrOp( PtrOp.t_pointer ) );
}
}
//const and volatile type-specifiers are ignored (only the outermost level)
if( nfo.getPtrOperators().size() == 0 ){
nfo.setBit( false, TypeInfo.isConst );
nfo.setBit( false, TypeInfo.isVolatile );
} else {
PtrOp op = (PtrOp) nfo.getPtrOperators().listIterator( nfo.getPtrOperators().size() ).previous();
op.setConst( false );
op.setVolatile( false );
}
if( nfo == fInfo )
break;
}
if( !info.equals( fInfo ) ){ if( !info.equals( fInfo ) ){
return false; return false;
} }

View file

@ -1105,6 +1105,8 @@ public class ParserSymbolTable {
int order = TemplateEngine.orderTemplateFunctions( t1, t2 ); int order = TemplateEngine.orderTemplateFunctions( t1, t2 );
if ( order < 0 ){ if ( order < 0 ){
hasBetter = true; hasBetter = true;
} else if( order > 0 ){
ambiguous = false;
} }
} }
} }
@ -1126,6 +1128,23 @@ public class ParserSymbolTable {
return bestFn; return bestFn;
} }
static private boolean functionHasParameters( IParameterizedSymbol function, List params ){
if( params == null ){
return function.getParameterList().isEmpty();
}
//create a new function that has params as its parameters, then use IParameterizedSymbol.hasSameParameters
IParameterizedSymbol tempFn = function.getSymbolTable().newParameterizedSymbol( EMPTY_NAME, TypeInfo.t_function );
Iterator i = params.iterator();
while( i.hasNext() ){
ISymbol param = function.getSymbolTable().newSymbol( EMPTY_NAME );
param.setTypeInfo( (TypeInfo) i.next() );
tempFn.addParameter( param );
}
return function.hasSameParameters( tempFn );
}
static private void reduceToViable( LookupData data, List functions ){ static private void reduceToViable( LookupData data, List functions ){
int numParameters = ( data.parameters == null ) ? 0 : data.parameters.size(); int numParameters = ( data.parameters == null ) ? 0 : data.parameters.size();
int num; int num;
@ -1140,6 +1159,9 @@ public class ParserSymbolTable {
//if there are m arguments in the list, all candidate functions having m parameters //if there are m arguments in the list, all candidate functions having m parameters
//are viable //are viable
if( num == numParameters ){ if( num == numParameters ){
if( data.exactFunctionsOnly && !functionHasParameters( function, data.parameters ) ){
iter.remove();
}
continue; continue;
} }
//check for void //check for void
@ -1455,11 +1477,7 @@ public class ParserSymbolTable {
TypeInfo.PtrOp ptr = (TypeInfo.PtrOp)iterator.next(); TypeInfo.PtrOp ptr = (TypeInfo.PtrOp)iterator.next();
if( ptr.getType() == TypeInfo.PtrOp.t_reference ){ if( ptr.getType() == TypeInfo.PtrOp.t_reference ){
if( ptr.isConst() || ptr.isVolatile() ){
iterator.set( new PtrOp( PtrOp.t_undef, ptr.isConst(), ptr.isVolatile() ) );
} else {
iterator.remove(); iterator.remove();
}
cost.targetHadReference = true; cost.targetHadReference = true;
} }
int size = targetPtrs.size(); int size = targetPtrs.size();
@ -1493,28 +1511,7 @@ public class ParserSymbolTable {
Iterator iter2 = cost.target.getPtrOperators().iterator(); Iterator iter2 = cost.target.getPtrOperators().iterator();
if( size != size2 ){ if( size != size2 ){
if( size2 - size == 1 ){
op2 = (PtrOp) iter2.next();
if( op2.isConst() || op2.isVolatile() ){
canConvert = true;
} else {
canConvert = false; canConvert = false;
}
} else {
canConvert = false;
}
} else if ( size == 1 ){
op1 = (TypeInfo.PtrOp) iter1.next();
op2 = (TypeInfo.PtrOp) iter2.next();
//can only convert if op2 is more qualified
if( ( op1.isConst() && !op2.isConst() ) ||
( op1.isVolatile() && !op2.isVolatile() ) )
{
cost.qualification = 0;
return;
}
canConvert = true;
} else if( size > 0 ){ } else if( size > 0 ){
op1 = (TypeInfo.PtrOp) iter1.next(); op1 = (TypeInfo.PtrOp) iter1.next();
op2 = (TypeInfo.PtrOp) iter2.next(); op2 = (TypeInfo.PtrOp) iter2.next();
@ -1548,6 +1545,12 @@ public class ParserSymbolTable {
} }
} }
if( ( cost.source.checkBit( TypeInfo.isConst ) && !cost.target.checkBit( TypeInfo.isConst ) ) ||
( cost.source.checkBit( TypeInfo.isVolatile ) && !cost.target.checkBit( TypeInfo.isVolatile ) ) )
{
canConvert = false;
}
if( canConvert == true ){ if( canConvert == true ){
cost.qualification = 1; cost.qualification = 1;
cost.rank = Cost.LVALUE_OR_QUALIFICATION_RANK; cost.rank = Cost.LVALUE_OR_QUALIFICATION_RANK;
@ -1574,7 +1577,7 @@ public class ParserSymbolTable {
TypeInfo src = cost.source; TypeInfo src = cost.source;
TypeInfo trg = cost.target; TypeInfo trg = cost.target;
int mask = TypeInfo.isShort | TypeInfo.isLong | TypeInfo.isUnsigned | TypeInfo.isLongLong; int mask = TypeInfo.isShort | TypeInfo.isLong | TypeInfo.isUnsigned | TypeInfo.isLongLong | TypeInfo.isSigned;
if( (src.isType( TypeInfo.t__Bool, TypeInfo.t_float ) || src.isType( TypeInfo.t_enumeration )) && if( (src.isType( TypeInfo.t__Bool, TypeInfo.t_float ) || src.isType( TypeInfo.t_enumeration )) &&
(trg.isType( TypeInfo.t_int ) || trg.isType( TypeInfo.t_double )) ) (trg.isType( TypeInfo.t_int ) || trg.isType( TypeInfo.t_double )) )
@ -1737,8 +1740,11 @@ public class ParserSymbolTable {
} }
} }
} }
} else if( cost.source.getType() == cost.target.getType() &&
(cost.source.getTypeInfo() & ~TypeInfo.isConst & ~TypeInfo.isVolatile) == (cost.target.getTypeInfo() & ~TypeInfo.isConst & ~TypeInfo.isVolatile) )
{
return cost;
} }
promotion( cost ); promotion( cost );
if( cost.promotion > 0 || cost.rank > -1 ){ if( cost.promotion > 0 || cost.rank > -1 ){
return cost; return cost;
@ -1904,7 +1910,7 @@ public class ParserSymbolTable {
if( topInfo.getType() == TypeInfo.t_type && topInfo.getTypeSymbol() != null ){ if( topInfo.getType() == TypeInfo.t_type && topInfo.getTypeSymbol() != null ){
returnInfo = new TypeInfo(); returnInfo = new TypeInfo();
returnInfo.setTypeInfo( topInfo.getTypeInfo() );
ISymbol typeSymbol = topInfo.getTypeSymbol(); ISymbol typeSymbol = topInfo.getTypeSymbol();
info = typeSymbol.getTypeInfo(); info = typeSymbol.getTypeInfo();
@ -1913,7 +1919,7 @@ public class ParserSymbolTable {
typeSymbol = info.getTypeSymbol(); typeSymbol = info.getTypeSymbol();
returnInfo.addPtrOperator( info.getPtrOperators() ); returnInfo.addPtrOperator( info.getPtrOperators() );
returnInfo.setTypeInfo( ( returnInfo.getTypeInfo() | info.getTypeInfo() ) & ~TypeInfo.isTypedef & ~TypeInfo.isForward );
info = typeSymbol.getTypeInfo(); info = typeSymbol.getTypeInfo();
} }
@ -1921,7 +1927,7 @@ public class ParserSymbolTable {
returnInfo.setType( TypeInfo.t_type ); returnInfo.setType( TypeInfo.t_type );
returnInfo.setTypeSymbol( typeSymbol ); returnInfo.setTypeSymbol( typeSymbol );
} else { } else {
returnInfo.setTypeInfo( info.getTypeInfo() ); returnInfo.setTypeInfo( ( returnInfo.getTypeInfo() | info.getTypeInfo() ) & ~TypeInfo.isTypedef & ~TypeInfo.isForward );
returnInfo.setType( info.getType() ); returnInfo.setType( info.getType() );
returnInfo.setTypeSymbol( null ); returnInfo.setTypeSymbol( null );
returnInfo.addPtrOperator( info.getPtrOperators() ); returnInfo.addPtrOperator( info.getPtrOperators() );
@ -1931,17 +1937,8 @@ public class ParserSymbolTable {
if( topInfo.hasPtrOperators() ){ if( topInfo.hasPtrOperators() ){
TypeInfo.PtrOp topPtr = (PtrOp) topInfo.getPtrOperators().iterator().next(); TypeInfo.PtrOp topPtr = (PtrOp) topInfo.getPtrOperators().iterator().next();
TypeInfo.PtrOp ptr = null; TypeInfo.PtrOp ptr = new PtrOp( topPtr.getType(), topPtr.isConst(), topPtr.isVolatile() );
if( returnInfo.hasPtrOperators() && topPtr.getType() == PtrOp.t_undef ){
ptr = (PtrOp)returnInfo.getPtrOperators().iterator().next();
} else {
ptr = new PtrOp();
returnInfo.addPtrOperator( ptr ); returnInfo.addPtrOperator( ptr );
ptr.setType( topPtr.getType() );
}
ptr.setConst( topPtr.isConst() );
ptr.setVolatile( topPtr.isVolatile() );
} }
} else { } else {
returnInfo = new TypeInfo( topInfo ); returnInfo = new TypeInfo( topInfo );
@ -2046,6 +2043,7 @@ public class ParserSymbolTable {
public boolean ignoreUsingDirectives = false; public boolean ignoreUsingDirectives = false;
public boolean usingDirectivesOnly = false; public boolean usingDirectivesOnly = false;
public boolean forUserDefinedConversion = false; public boolean forUserDefinedConversion = false;
public boolean exactFunctionsOnly = false;
public Map foundItems = null; public Map foundItems = null;

View file

@ -44,22 +44,15 @@ public final class TemplateEngine {
TypeInfo targetInfo = new TypeInfo( (TypeInfo) argMap.get( info.getTypeSymbol() ) ); TypeInfo targetInfo = new TypeInfo( (TypeInfo) argMap.get( info.getTypeSymbol() ) );
if( info.hasPtrOperators() ){ if( info.hasPtrOperators() ){
List infoOperators = new LinkedList( info.getPtrOperators() ); List infoOperators = new LinkedList( info.getPtrOperators() );
if( targetInfo.hasPtrOperators() ){
List targetOperators = targetInfo.getPtrOperators();
PtrOp lastTargetOp = (PtrOp) targetOperators.get( targetOperators.size() - 1 );
if( lastTargetOp.getType() == PtrOp.t_undef ){
targetOperators.remove( targetOperators.size() - 1 );
PtrOp infoOp = (PtrOp) infoOperators.get( 0 );
infoOp = new PtrOp( infoOp.getType(), infoOp.isConst() || lastTargetOp.isConst(),
infoOp.isVolatile() || lastTargetOp.isVolatile() );
infoOperators.set( 0, infoOp );
}
}
targetInfo.addPtrOperator( infoOperators ); targetInfo.addPtrOperator( infoOperators );
} }
if( info.checkBit( TypeInfo.isConst ) )
targetInfo.setBit( true, TypeInfo.isConst );
if( info.checkBit( TypeInfo.isVolatile ) )
targetInfo.setBit( true, TypeInfo.isVolatile );
return targetInfo; return targetInfo;
} else if( info.isType( TypeInfo.t_type ) && info.getTypeSymbol().isType( TypeInfo.t_function ) ){ } else if( info.isType( TypeInfo.t_type ) && info.getTypeSymbol().isType( TypeInfo.t_function ) ){
TypeInfo newInfo = new TypeInfo( info ); TypeInfo newInfo = new TypeInfo( info );
@ -291,23 +284,29 @@ public final class TemplateEngine {
PtrOp newOp = new PtrOp( pOp.getType(), false, false ); PtrOp newOp = new PtrOp( pOp.getType(), false, false );
pPtrs.set( 0, newOp ); pPtrs.set( 0, newOp );
} }
} else {
p.setBit( false, TypeInfo.isConst );
p.setBit( false, TypeInfo.isVolatile );
} }
return p; return p;
} }
/** /**
* 14.8.2.1-2 * 14.8.2.1-2
* if P is not a reference type
* - If A is an array type, the pointer type produced by the array-to-pointer conversion is used instead * - If A is an array type, the pointer type produced by the array-to-pointer conversion is used instead
* - If A is a function type, the pointer type produced by the function-to-pointer conversion is used instead * - If A is a function type, the pointer type produced by the function-to-pointer conversion is used instead
* - If A is a cv-qualified type, the top level cv-qualifiers are ignored for type deduction * - If A is a cv-qualified type, the top level cv-qualifiers are ignored for type deduction
* @param aInfo * @param aInfo
* @return * @return
*/ */
static private TypeInfo getArgumentTypeForDeduction( TypeInfo aInfo ){ static private TypeInfo getArgumentTypeForDeduction( TypeInfo aInfo, boolean pIsAReferenceType ){
TypeInfo a = ParserSymbolTable.getFlatTypeInfo( aInfo ); TypeInfo a = ParserSymbolTable.getFlatTypeInfo( aInfo );
if( !pIsAReferenceType ){
List aPtrs = a.getPtrOperators(); List aPtrs = a.getPtrOperators();
ISymbol aSymbol = a.getTypeSymbol(); ISymbol aSymbol = a.getTypeSymbol();
@ -321,11 +320,13 @@ public final class TemplateEngine {
if( pOp.getType() == PtrOp.t_array ){ if( pOp.getType() == PtrOp.t_array ){
aPtrs.set( 0, new PtrOp( PtrOp.t_pointer, false, false ) ); aPtrs.set( 0, new PtrOp( PtrOp.t_pointer, false, false ) );
} else if( pOp.getType() == PtrOp.t_undef ){
aPtrs.remove( 0 );
} else { } else {
aPtrs.set( 0, new PtrOp( pOp.getType(), false, false ) ); aPtrs.set( 0, new PtrOp( pOp.getType(), false, false ) );
} }
} else {
a.setBit( false, TypeInfo.isConst );
a.setBit( false, TypeInfo.isVolatile );
}
} }
return a; return a;
@ -415,8 +416,16 @@ public final class TemplateEngine {
static private boolean deduceTemplateArgument( Map map, ISymbol pSymbol, TypeInfo a ){//, Map argumentMap ){ static private boolean deduceTemplateArgument( Map map, ISymbol pSymbol, TypeInfo a ){//, Map argumentMap ){
ISymbol symbol; ISymbol symbol;
boolean pIsAReferenceType = false;
Iterator i = pSymbol.getPtrOperators().iterator();
if( i.hasNext() && ((PtrOp)i.next()).getType() == TypeInfo.PtrOp.t_reference ){
pIsAReferenceType = true;
}
TypeInfo p = getParameterTypeForDeduction( pSymbol ); TypeInfo p = getParameterTypeForDeduction( pSymbol );
a = getArgumentTypeForDeduction( a );
a = getArgumentTypeForDeduction( a, pIsAReferenceType );
if( p.isType( TypeInfo.t_type ) ){ if( p.isType( TypeInfo.t_type ) ){
symbol = p.getTypeSymbol(); symbol = p.getTypeSymbol();
@ -429,7 +438,7 @@ public final class TemplateEngine {
//a = getFlatTypeInfo( a ); //a = getFlatTypeInfo( a );
List aPtrs = a.getPtrOperators(); List aPtrs = a.getPtrOperators();
List pPtrs = p.getPtrOperators(); List pPtrs = p.getPtrOperators();
//TODO cvlist T
if( pPtrs != null && pPtrs.size() > 0){ if( pPtrs != null && pPtrs.size() > 0){
if( aPtrs == null ){ if( aPtrs == null ){
return false; return false;
@ -447,28 +456,31 @@ public final class TemplateEngine {
aOp = (PtrOp) aIter.next(); aOp = (PtrOp) aIter.next();
if( pOp.getType() == aOp.getType() ){ if( pOp.getType() == aOp.getType() ){
if( !pOp.equals( aOp ) ){ if( !pOp.equals( aOp ) ){
if( pIter.hasNext() || pOp.compareCVTo( aOp ) > 0 ){
return false; return false;
} else {
PtrOp newOp = new PtrOp( PtrOp.t_undef );
newOp.setConst( aOp.isConst() );
newOp.setVolatile( aOp.isVolatile() );
aIter.set( newOp );
}
} else { } else {
aIter.remove(); aIter.remove();
} }
} else { } else {
return false; return false;
} }
} }
} }
return deduceArgument( map, symbol, a ); }
} else { //cvlist T
if( p.checkBit( TypeInfo.isConst ) ){
if( !a.checkBit( TypeInfo.isConst ) )
return false;
a.setBit( false, TypeInfo.isConst);
}
if( p.checkBit( TypeInfo.isVolatile ) ){
if( !a.checkBit( TypeInfo.isVolatile ) )
return false;
a.setBit( false, TypeInfo.isVolatile);
}
//T //T
return deduceArgument( map, symbol, a ); return deduceArgument( map, symbol, a );
}
} else if ( symbol.getTypeInfo().getTemplateParameterType() == TypeInfo.t_template ){ } else if ( symbol.getTypeInfo().getTemplateParameterType() == TypeInfo.t_template ){
} else { } else {

View file

@ -341,23 +341,6 @@ public class TypeInfo {
Iterator iter1 = getPtrOperators().iterator(); Iterator iter1 = getPtrOperators().iterator();
Iterator iter2 = type.getPtrOperators().iterator(); Iterator iter2 = type.getPtrOperators().iterator();
TypeInfo.PtrOp ptr1 = null, ptr2 = null; TypeInfo.PtrOp ptr1 = null, ptr2 = null;
if( size2 < size ) {
for( int i = size; i > size2; i-- ){
ptr2 = (PtrOp) iter1.next();
if( ptr2.getType() != PtrOp.t_undef ){
return false;
}
}
size = size2;
} else if ( size < size2 ){
for( int i = size2; i > size; i-- ){
ptr1 = (PtrOp)iter2.next();
if( ptr1.getType() != PtrOp.t_undef ){
return false;
}
}
size2 = size;
}
if( size == size2 ){ if( size == size2 ){
if( size > 0 ){ if( size > 0 ){