Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
[cdt-patch] Fix bugs 47628, 47636, 45697

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

-Andrew

Index: parser/ChangeLog-parser
===================================================================
retrieving revision 1.54
diff -u -r1.54 ChangeLog-parser
--- parser/ChangeLog-parser	12 Feb 2004 14:19:58 -0000	1.54
+++ parser/ChangeLog-parser	12 Feb 2004 22:18:02 -0000
@@ -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
 	Removed IASTCompletionKind.SCOPED_REFERENCE as it was obsolete.  
 	Did preliminary work to support content assist within qualified names.
Index: parser/org/eclipse/cdt/internal/core/parser/ast/complete/ASTSimpleTypeSpecifier.java
===================================================================
retrieving revision 1.7
diff -u -r1.7 ASTSimpleTypeSpecifier.java
--- parser/org/eclipse/cdt/internal/core/parser/ast/complete/ASTSimpleTypeSpecifier.java	15 Jan 2004 13:37:53 -0000	1.7
+++ parser/org/eclipse/cdt/internal/core/parser/ast/complete/ASTSimpleTypeSpecifier.java	12 Feb 2004 22:18:06 -0000
@@ -94,7 +94,7 @@
      */
     public boolean isSigned()
     {
-        return ! symbol.getTypeInfo().checkBit( TypeInfo.isUnsigned);
+        return symbol.getTypeInfo().checkBit( TypeInfo.isSigned);
     }
     /* (non-Javadoc)
      * @see org.eclipse.cdt.core.parser.ast.IASTSimpleTypeSpecifier#isUnsigned()
Index: parser/org/eclipse/cdt/internal/core/parser/ast/complete/CompleteParseASTFactory.java
===================================================================
retrieving revision 1.74
diff -u -r1.74 CompleteParseASTFactory.java
--- parser/org/eclipse/cdt/internal/core/parser/ast/complete/CompleteParseASTFactory.java	10 Feb 2004 15:33:51 -0000	1.74
+++ parser/org/eclipse/cdt/internal/core/parser/ast/complete/CompleteParseASTFactory.java	12 Feb 2004 22:18:08 -0000
@@ -29,6 +29,7 @@
 import org.eclipse.cdt.core.parser.ast.IASTASMDefinition;
 import org.eclipse.cdt.core.parser.ast.IASTAbstractDeclaration;
 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.IASTCodeScope;
 import org.eclipse.cdt.core.parser.ast.IASTCompilationUnit;
@@ -1590,6 +1591,7 @@
 		s.getTypeInfo().setBit( isUnsigned, TypeInfo.isUnsigned );
 		s.getTypeInfo().setBit( isComplex, TypeInfo.isComplex );
 		s.getTypeInfo().setBit( isImaginary, TypeInfo.isImaginary );
+		s.getTypeInfo().setBit( isSigned, TypeInfo.isSigned );
 			
 		return new ASTSimpleTypeSpecifier( s, false, typeName.toString(), references );
 
@@ -1675,37 +1677,42 @@
 		 
 		symbol.setIsForwardDeclaration(!isFunctionDefinition);
 		boolean previouslyDeclared = false;
-		if( isFunctionDefinition )
-		{
-			List functionParameters = new LinkedList();
-			// the lookup requires a list of type infos
-			// instead of a list of IASTParameterDeclaration
-			Iterator p = parameters.iterator();
-			while (p.hasNext()){
-				ASTParameterDeclaration param = (ASTParameterDeclaration)p.next();
-				functionParameters.add(param.getSymbol().getTypeInfo());
-			}
-			
-			IParameterizedSymbol functionDeclaration = null; 
-			
-			functionDeclaration = 
-				(IParameterizedSymbol) lookupQualifiedName(ownerScope, name.getLastToken().getImage(), TypeInfo.t_function, functionParameters, 0, new ArrayList(), false, LookupType.UNQUALIFIED );                
 
-			if( functionDeclaration != null )
-			{
+		List functionParameters = new LinkedList();
+		// the lookup requires a list of type infos
+		// instead of a list of IASTParameterDeclaration
+		Iterator p = parameters.iterator();
+		while (p.hasNext()){
+			ASTParameterDeclaration param = (ASTParameterDeclaration)p.next();
+			functionParameters.add(param.getSymbol().getTypeInfo());
+		}
+		
+		IParameterizedSymbol functionDeclaration = null; 
+		
+		functionDeclaration = 
+			(IParameterizedSymbol) lookupQualifiedName(ownerScope, name.getLastToken().getImage(), TypeInfo.t_function, functionParameters, 0, new ArrayList(), false, LookupType.FORDEFINITION );                
+
+		if( functionDeclaration != null ){
+			previouslyDeclared = true;
+			
+			if( isFunctionDefinition ){
 				functionDeclaration.setTypeSymbol( symbol );
-				previouslyDeclared = true;
 			}
 		}
 		
-		try
-		{
-			ownerScope.addSymbol( symbol );
-		}
-		catch (ParserSymbolTableException e)
-		{
-			throw new ASTSemanticException();   
+		if( previouslyDeclared == false || isFunctionDefinition ){
+			try
+			{
+				ownerScope.addSymbol( symbol );
+			}
+			catch (ParserSymbolTableException e)
+			{
+				throw new ASTSemanticException();   
+			}	
+		} else {
+			symbol = functionDeclaration;
 		}
+		
 		ASTFunction function = new ASTFunction( symbol, nameEndOffset, parameters, returnType, exception, startOffset, startLine, nameOffset, nameLine, ownerTemplate, references, previouslyDeclared, hasFunctionTryBlock );        
 	    try
 	    {
@@ -1823,6 +1830,7 @@
 		
 		ISymbol xrefSymbol = null;
 		List newReferences = null; 
+		int infoBits = 0;
 	    if( absDecl.getTypeSpecifier() instanceof IASTSimpleTypeSpecifier ) 
 	    {
 	   		if( ((IASTSimpleTypeSpecifier)absDecl.getTypeSpecifier()).getType() == IASTSimpleTypeSpecifier.Type.CLASS_OR_TYPENAME )
@@ -1830,6 +1838,8 @@
 	    		xrefSymbol = ((ASTSimpleTypeSpecifier)absDecl.getTypeSpecifier()).getSymbol(); 
 	    		newReferences = ((ASTSimpleTypeSpecifier)absDecl.getTypeSpecifier()).getReferences();
 	    	}
+	   		
+	   		infoBits = ((ASTSimpleTypeSpecifier)absDecl.getTypeSpecifier()).getSymbol().getTypeInfo().getTypeInfo();
 	    }
 	    else if( absDecl.getTypeSpecifier() instanceof ASTElaboratedTypeSpecifier )
 	    {
@@ -1849,6 +1859,10 @@
 	    if( xrefSymbol != null )
 	    	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() );
 	
 	    if( isParameter)
@@ -2317,6 +2331,7 @@
         newSymbol.getTypeInfo().setBit( isRegister, TypeInfo.isRegister );
         newSymbol.getTypeInfo().setBit( isStatic, TypeInfo.isStatic );
         newSymbol.getTypeInfo().setBit( abstractDeclaration.isConst(), TypeInfo.isConst );
+        newSymbol.getTypeInfo().setBit( abstractDeclaration.isVolatile(), TypeInfo.isVolatile );
     }
     
     protected ISymbol cloneSimpleTypeSymbol(
@@ -2779,6 +2794,7 @@
 		result.getTypeInfo().setBit( id.isShort(), TypeInfo.isShort);
 		result.getTypeInfo().setBit( id.isLong(), TypeInfo.isLong);
 		result.getTypeInfo().setBit( id.isUnsigned(), TypeInfo.isUnsigned);
+		result.getTypeInfo().setBit( id.isSigned(), TypeInfo.isSigned );
 		
 		List refs = new ArrayList();
 		if( result.getType() == TypeInfo.t_type )
Index: parser/org/eclipse/cdt/internal/core/parser/pst/ContainerSymbol.java
===================================================================
retrieving revision 1.12
diff -u -r1.12 ContainerSymbol.java
--- parser/org/eclipse/cdt/internal/core/parser/pst/ContainerSymbol.java	11 Feb 2004 03:07:26 -0000	1.12
+++ parser/org/eclipse/cdt/internal/core/parser/pst/ContainerSymbol.java	12 Feb 2004 22:18:10 -0000
@@ -444,6 +444,7 @@
 		LookupData data = new LookupData( name, TypeInfo.t_any );
 		data.qualified = true;
 		data.parameters = ( parameters == null ) ? new LinkedList() : parameters;
+		data.exactFunctionsOnly = true;
 		
 		IContainerSymbol container = this;
 		
Index: parser/org/eclipse/cdt/internal/core/parser/pst/DerivableContainerSymbol.java
===================================================================
retrieving revision 1.6
diff -u -r1.6 DerivableContainerSymbol.java
--- parser/org/eclipse/cdt/internal/core/parser/pst/DerivableContainerSymbol.java	11 Feb 2004 03:07:26 -0000	1.6
+++ parser/org/eclipse/cdt/internal/core/parser/pst/DerivableContainerSymbol.java	12 Feb 2004 22:18:11 -0000
@@ -170,14 +170,15 @@
 	public void addCopyConstructor() throws ParserSymbolTableException{
 		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 );
 		
 		IParameterizedSymbol constructor = lookupConstructor( parameters );
 		
 		if( constructor == null ){
 			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 );	
 		}
 	}
@@ -248,10 +249,8 @@
 				//thisObj.setCVQualifier( obj.getCVQualifier() );
 				TypeInfo.PtrOp ptr = new TypeInfo.PtrOp();
 				ptr.setType( TypeInfo.PtrOp.t_pointer );
-				if( obj.getTypeInfo().hasPtrOperators() ){
-					ptr.setConst( ((TypeInfo.PtrOp) obj.getPtrOperators().iterator().next()).isConst() );
-					ptr.setVolatile( ((TypeInfo.PtrOp) obj.getPtrOperators().iterator().next()).isVolatile() );
-				}
+				thisObj.getTypeInfo().setBit( obj.getTypeInfo().checkBit( TypeInfo.isConst ), TypeInfo.isConst );
+				thisObj.getTypeInfo().setBit( obj.getTypeInfo().checkBit( TypeInfo.isVolatile ), TypeInfo.isVolatile );
 				
 				thisObj.addPtrOperator(ptr);
 				
Index: parser/org/eclipse/cdt/internal/core/parser/pst/IParameterizedSymbol.java
===================================================================
retrieving revision 1.7
diff -u -r1.7 IParameterizedSymbol.java
--- parser/org/eclipse/cdt/internal/core/parser/pst/IParameterizedSymbol.java	11 Feb 2004 03:07:26 -0000	1.7
+++ parser/org/eclipse/cdt/internal/core/parser/pst/IParameterizedSymbol.java	12 Feb 2004 22:18:11 -0000
@@ -30,7 +30,7 @@
 	
 	public void addParameter( ISymbol param );
 	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 List getParameterList();
Index: parser/org/eclipse/cdt/internal/core/parser/pst/ParameterizedSymbol.java
===================================================================
retrieving revision 1.5
diff -u -r1.5 ParameterizedSymbol.java
--- parser/org/eclipse/cdt/internal/core/parser/pst/ParameterizedSymbol.java	11 Feb 2004 03:07:26 -0000	1.5
+++ parser/org/eclipse/cdt/internal/core/parser/pst/ParameterizedSymbol.java	12 Feb 2004 22:18:11 -0000
@@ -17,11 +17,13 @@
 import java.util.Iterator;
 import java.util.LinkedList;
 import java.util.List;
+import java.util.ListIterator;
 import java.util.Map;
 import java.util.TreeMap;
 
 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.TypeInfo.PtrOp;
 
 /**
  * @author aniefer
@@ -137,14 +139,15 @@
 	/* (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)
 	 */
-	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);
 		
-		TypeInfo info = param.getTypeInfo();
-		info.setType( TypeInfo.t_type );
-		info.setTypeSymbol( typeSymbol );
-		info.addPtrOperator( ptrOp );
-		info.setHasDefault( hasDefault );
+		TypeInfo nfo = param.getTypeInfo();
+		nfo.setTypeInfo( info );
+		nfo.setType( TypeInfo.t_type );
+		nfo.setTypeSymbol( typeSymbol );
+		nfo.addPtrOperator( ptrOp );
+		nfo.setHasDefault( hasDefault );
 			
 		addParameter( param );
 	}
@@ -204,7 +207,44 @@
 		for( int i = size; i > 0; i-- ){
 			info = ((BasicSymbol)iter.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 ) ){
 				return false;
 			}
Index: parser/org/eclipse/cdt/internal/core/parser/pst/ParserSymbolTable.java
===================================================================
retrieving revision 1.39
diff -u -r1.39 ParserSymbolTable.java
--- parser/org/eclipse/cdt/internal/core/parser/pst/ParserSymbolTable.java	11 Feb 2004 03:07:26 -0000	1.39
+++ parser/org/eclipse/cdt/internal/core/parser/pst/ParserSymbolTable.java	12 Feb 2004 22:18:12 -0000
@@ -1105,7 +1105,9 @@
 						int order = TemplateEngine.orderTemplateFunctions( t1, t2 );
 						if ( order < 0 ){
 							hasBetter = true;	 				
-						} 
+						} else if( order > 0 ){
+							ambiguous = false;
+						}
 					}
 				}
 				if( hasBetter ){
@@ -1126,6 +1128,23 @@
 		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 ){
 		int numParameters = ( data.parameters == null ) ? 0 : data.parameters.size();
 		int num;	
@@ -1140,6 +1159,9 @@
 			//if there are m arguments in the list, all candidate functions having m parameters
 			//are viable	 
 			if( num == numParameters ){
+				if( data.exactFunctionsOnly && !functionHasParameters( function, data.parameters ) ){
+					iter.remove();
+				}
 				continue;
 			} 
 			//check for void
@@ -1455,11 +1477,7 @@
 			TypeInfo.PtrOp ptr = (TypeInfo.PtrOp)iterator.next();
 
 			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;
 			}
 			int size = targetPtrs.size();
@@ -1491,30 +1509,9 @@
 		
 		Iterator iter1 = cost.source.getPtrOperators().iterator();
 		Iterator iter2 = cost.target.getPtrOperators().iterator();
-		
+
 		if( size != size2 ){
-			if( size2 - size == 1 ){
-				op2 = (PtrOp) iter2.next();
-				if( op2.isConst() || op2.isVolatile() ){
-					canConvert = true;
-				} else {
-					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;
+			canConvert = false;
 		} else if( size > 0 ){
 			op1 = (TypeInfo.PtrOp) iter1.next();
 			op2 = (TypeInfo.PtrOp) iter2.next();
@@ -1548,6 +1545,12 @@
 			}
 		}
 		
+		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 ){
 			cost.qualification = 1;
 			cost.rank = Cost.LVALUE_OR_QUALIFICATION_RANK;
@@ -1574,7 +1577,7 @@
 		TypeInfo src = cost.source;
 		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 )) &&
 			(trg.isType( TypeInfo.t_int ) || trg.isType( TypeInfo.t_double )) )
@@ -1737,8 +1740,11 @@
 					}
 				}
 			}
+		} 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 );
 		if( cost.promotion > 0 || cost.rank > -1 ){
 			return cost;
@@ -1904,7 +1910,7 @@
 		
 		if( topInfo.getType() == TypeInfo.t_type && topInfo.getTypeSymbol() != null ){
 			returnInfo = new TypeInfo();
-			
+			returnInfo.setTypeInfo( topInfo.getTypeInfo() );
 			ISymbol typeSymbol = topInfo.getTypeSymbol();
 			
 			info = typeSymbol.getTypeInfo();
@@ -1913,7 +1919,7 @@
 				typeSymbol = info.getTypeSymbol();
 				
 				returnInfo.addPtrOperator( info.getPtrOperators() );	
-				
+				returnInfo.setTypeInfo( ( returnInfo.getTypeInfo() | info.getTypeInfo() ) & ~TypeInfo.isTypedef & ~TypeInfo.isForward );
 				info = typeSymbol.getTypeInfo();
 			}
 			
@@ -1921,7 +1927,7 @@
 				returnInfo.setType( TypeInfo.t_type );
 				returnInfo.setTypeSymbol( typeSymbol );
 			} else {
-				returnInfo.setTypeInfo( info.getTypeInfo() );
+				returnInfo.setTypeInfo( ( returnInfo.getTypeInfo() | info.getTypeInfo() ) & ~TypeInfo.isTypedef & ~TypeInfo.isForward );
 				returnInfo.setType( info.getType() );
 				returnInfo.setTypeSymbol( null );
 				returnInfo.addPtrOperator( info.getPtrOperators() );
@@ -1931,17 +1937,8 @@
 			
 			if( topInfo.hasPtrOperators() ){
 				TypeInfo.PtrOp topPtr = (PtrOp) topInfo.getPtrOperators().iterator().next();
-				TypeInfo.PtrOp ptr = null;
-				if( returnInfo.hasPtrOperators() && topPtr.getType() == PtrOp.t_undef ){
-					ptr = (PtrOp)returnInfo.getPtrOperators().iterator().next();
-				} else {
-					ptr = new PtrOp();
-					returnInfo.addPtrOperator( ptr );	
-					ptr.setType( topPtr.getType() );				
-				}
-				
-				ptr.setConst( topPtr.isConst() );
-				ptr.setVolatile( topPtr.isVolatile() );
+				TypeInfo.PtrOp ptr = new PtrOp( topPtr.getType(), topPtr.isConst(), topPtr.isVolatile() );
+				returnInfo.addPtrOperator( ptr );
 			}
 		} else {
 			returnInfo = new TypeInfo( topInfo );
@@ -2046,6 +2043,7 @@
 		public boolean ignoreUsingDirectives = false;
 		public boolean usingDirectivesOnly = false;
 		public boolean forUserDefinedConversion = false;
+		public boolean exactFunctionsOnly = false;
 		
 		public Map foundItems = null;
 		
Index: parser/org/eclipse/cdt/internal/core/parser/pst/TemplateEngine.java
===================================================================
retrieving revision 1.2
diff -u -r1.2 TemplateEngine.java
--- parser/org/eclipse/cdt/internal/core/parser/pst/TemplateEngine.java	11 Feb 2004 23:14:22 -0000	1.2
+++ parser/org/eclipse/cdt/internal/core/parser/pst/TemplateEngine.java	12 Feb 2004 22:18:12 -0000
@@ -44,22 +44,15 @@
 				TypeInfo targetInfo = new TypeInfo( (TypeInfo) argMap.get( info.getTypeSymbol() ) );
 				if( info.hasPtrOperators() ){
 					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 );
 				}
+				
+				if( info.checkBit( TypeInfo.isConst ) )
+					targetInfo.setBit( true, TypeInfo.isConst );
+				
+				if( info.checkBit( TypeInfo.isVolatile ) )
+					targetInfo.setBit( true, TypeInfo.isVolatile );
+				
 				return targetInfo;
 			} else if( info.isType( TypeInfo.t_type ) && info.getTypeSymbol().isType( TypeInfo.t_function ) ){
 				TypeInfo newInfo = new TypeInfo( info );
@@ -291,40 +284,48 @@
 				PtrOp newOp = new PtrOp( pOp.getType(), false, false );
 				pPtrs.set( 0, newOp );
 			}
+		} else {
+			p.setBit( false, TypeInfo.isConst );
+			p.setBit( false, TypeInfo.isVolatile );
 		}
+		
 
 		return p;
 	}
 	
 	/**
 	 * 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 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 
 	 * @param aInfo
 	 * @return
 	 */
-	static private TypeInfo getArgumentTypeForDeduction( TypeInfo aInfo ){
+	static private TypeInfo getArgumentTypeForDeduction( TypeInfo aInfo, boolean pIsAReferenceType ){
 		
 		TypeInfo a = ParserSymbolTable.getFlatTypeInfo( aInfo );
 		
-		List aPtrs = a.getPtrOperators();
-		ISymbol aSymbol = a.getTypeSymbol();
-		
-		if( a.getType() == TypeInfo.t_type && aSymbol.isType( TypeInfo.t_function ) ){
-			if( aPtrs.size() == 0 ){
-				aPtrs.add( new PtrOp( PtrOp.t_pointer ) );	
-			}
-		}
-		if( aPtrs.size() > 0 ){
-			PtrOp pOp = (PtrOp) aPtrs.get( 0 );
+		if( !pIsAReferenceType ){
+			List aPtrs = a.getPtrOperators();
+			ISymbol aSymbol = a.getTypeSymbol();
 			
-			if( pOp.getType() == PtrOp.t_array ){
-				aPtrs.set( 0, new PtrOp( PtrOp.t_pointer, false, false ) );
-			} else if( pOp.getType() == PtrOp.t_undef ){
-				aPtrs.remove( 0 );
+			if( a.getType() == TypeInfo.t_type && aSymbol.isType( TypeInfo.t_function ) ){
+				if( aPtrs.size() == 0 ){
+					aPtrs.add( new PtrOp( PtrOp.t_pointer ) );	
+				}
+			}
+			if( aPtrs.size() > 0 ){
+				PtrOp pOp = (PtrOp) aPtrs.get( 0 );
+				
+				if( pOp.getType() == PtrOp.t_array ){
+					aPtrs.set( 0, new PtrOp( PtrOp.t_pointer, false, false ) );
+				} else {
+					aPtrs.set( 0, new PtrOp( pOp.getType(), false, false ) );
+				}
 			} else {
-				aPtrs.set( 0, new PtrOp( pOp.getType(), false, false ) );
+				a.setBit( false, TypeInfo.isConst );
+				a.setBit( false, TypeInfo.isVolatile );
 			}
 		}
 		
@@ -415,8 +416,16 @@
 	static private boolean deduceTemplateArgument( Map map, ISymbol pSymbol, TypeInfo a ){//, Map argumentMap ){
 		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 );
-		a = getArgumentTypeForDeduction( a );
+		
+		a = getArgumentTypeForDeduction( a, pIsAReferenceType );
 		
 		if( p.isType( TypeInfo.t_type ) ){
 			symbol = p.getTypeSymbol();
@@ -429,7 +438,7 @@
 						//a = getFlatTypeInfo( a );
 						List aPtrs = a.getPtrOperators();
 						List pPtrs = p.getPtrOperators();
-						//TODO  cvlist T
+						
 						if( pPtrs != null && pPtrs.size() > 0){
 							if( aPtrs == null ){
 								return false;
@@ -447,28 +456,31 @@
 									aOp = (PtrOp) aIter.next();
 									if( pOp.getType() == aOp.getType() ){
 										if( !pOp.equals( aOp ) ){
-											if( pIter.hasNext() || pOp.compareCVTo( aOp ) > 0 ){
-												return false;
-											} else {
-												PtrOp newOp = new PtrOp( PtrOp.t_undef );
-												newOp.setConst( aOp.isConst() );
-												newOp.setVolatile( aOp.isVolatile() );
-												aIter.set( newOp );
-											}
+											return false;
 										} else {
 											aIter.remove();
-										}
-										
+										}	
 									} else {
 										return false;
 									}
 								}
-							}
-							return deduceArgument( map, symbol, a );
-						} else {
-							//T
-							return deduceArgument( map, symbol, a );
-						}		
+							} 
+						}
+						//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
+						return deduceArgument( map, symbol, a );
+							
 					} else if ( symbol.getTypeInfo().getTemplateParameterType() == TypeInfo.t_template ){
 						
 					} else {
Index: parser/org/eclipse/cdt/internal/core/parser/pst/TypeInfo.java
===================================================================
retrieving revision 1.12
diff -u -r1.12 TypeInfo.java
--- parser/org/eclipse/cdt/internal/core/parser/pst/TypeInfo.java	11 Feb 2004 03:07:26 -0000	1.12
+++ parser/org/eclipse/cdt/internal/core/parser/pst/TypeInfo.java	12 Feb 2004 22:18:12 -0000
@@ -341,23 +341,6 @@
 		Iterator iter1 = getPtrOperators().iterator();
 		Iterator iter2 = type.getPtrOperators().iterator();
 		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 > 0 ){
Index: ChangeLog
===================================================================
retrieving revision 1.184
diff -u -r1.184 ChangeLog
--- ChangeLog	11 Feb 2004 23:14:24 -0000	1.184
+++ ChangeLog	12 Feb 2004 22:17:15 -0000
@@ -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
 	Updated tests to accommodate for new Parser class hierarchy and factories.  
 
Index: parser/org/eclipse/cdt/core/parser/tests/CompleteParseASTTest.java
===================================================================
retrieving revision 1.53
diff -u -r1.53 CompleteParseASTTest.java
--- parser/org/eclipse/cdt/core/parser/tests/CompleteParseASTTest.java	10 Feb 2004 15:33:41 -0000	1.53
+++ parser/org/eclipse/cdt/core/parser/tests/CompleteParseASTTest.java	12 Feb 2004 22:17:18 -0000
@@ -1203,35 +1203,82 @@
 		assertAllReferences( 1, createTaskList( new Task( x )));		
 	}
 	
-//	public void testBug47628() throws Exception
-//	{
-//		Writer writer = new StringWriter(); 
-//		writer.write( "void h(char) { }\n");
-//		writer.write( "void h(unsigned 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() );
-//	}
+	public void testBug47628() throws Exception
+	{
+		Writer writer = new StringWriter(); 
+		writer.write( "void h(char) { }\n");
+		writer.write( "void h(unsigned 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() );
+	}
 	
+	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( i.hasNext() );
+	}
 	
 }
Index: parser/org/eclipse/cdt/core/parser/tests/ParserSymbolTableTemplateTests.java
===================================================================
retrieving revision 1.1
diff -u -r1.1 ParserSymbolTableTemplateTests.java
--- parser/org/eclipse/cdt/core/parser/tests/ParserSymbolTableTemplateTests.java	11 Feb 2004 03:07:33 -0000	1.1
+++ parser/org/eclipse/cdt/core/parser/tests/ParserSymbolTableTemplateTests.java	12 Feb 2004 22:17:19 -0000
@@ -275,7 +275,7 @@
 		table.getCompilationUnit().addSymbol( f1 );
 		
 		IParameterizedSymbol f2 = table.newParameterizedSymbol( "f", TypeInfo.t_function );
-		f2.addParameter( lookA, null, false );
+		f2.addParameter( lookA, 0, null, false );
 		table.getCompilationUnit().addSymbol( f2 );
 		
 		IParameterizedSymbol f3 = table.newParameterizedSymbol( "f", TypeInfo.t_function );
@@ -1060,7 +1060,7 @@
 		
 		IParameterizedSymbol compare = table.newParameterizedSymbol( "compare", TypeInfo.t_function );
 		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 );
 		template2.addSymbol( compare );
 		
@@ -1083,7 +1083,7 @@
 		IParameterizedSymbol compareDef = table.newParameterizedSymbol( "compare", TypeInfo.t_function );
 		ISymbol look = factory.lookupParam( "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 );
 		compare.setTypeSymbol( compareDef );
 		factory.addSymbol( compareDef );
@@ -1142,7 +1142,7 @@
 		memberTemplate.addTemplateParameter( C );
 		
 		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 );
 		
 		memberTemplate.addSymbol( g );
@@ -1400,7 +1400,7 @@
 		template1.addTemplateParameter( table.newSymbol( "T", TypeInfo.t_templateParameter ) );
 		ISymbol T = template1.lookup( "T" );
 		IParameterizedSymbol f1 = table.newParameterizedSymbol( "f", TypeInfo.t_function );
-		f1.addParameter( T, null, false );
+		f1.addParameter( T, 0, null, false );
 		template1.addSymbol( f1 );
 		table.getCompilationUnit().addSymbol( template1 );
 		
@@ -1408,7 +1408,7 @@
 		template2.addTemplateParameter( table.newSymbol( "T", TypeInfo.t_templateParameter ) );
 		T = template2.lookup( "T" );
 		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 );
 		table.getCompilationUnit().addSymbol( template2 );
 		
@@ -1417,12 +1417,13 @@
 		template3.addTemplateParameter( table.newSymbol( "T", TypeInfo.t_templateParameter ) );
 		T = template3.lookup( "T" );
 		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 );
 		table.getCompilationUnit().addSymbol( template3 );
 		
 		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 );
 		
 		List params = new LinkedList();
@@ -1449,7 +1450,7 @@
 		template1.addTemplateParameter( table.newSymbol( "T", TypeInfo.t_templateParameter ) );
 		ISymbol T = template1.lookup( "T" );
 		IParameterizedSymbol g1 = table.newParameterizedSymbol( "g", TypeInfo.t_function );
-		g1.addParameter( T, null, false );
+		g1.addParameter( T, 0, null, false );
 		template1.addSymbol( g1 );
 		table.getCompilationUnit().addSymbol( template1 );
 		
@@ -1457,7 +1458,7 @@
 		template2.addTemplateParameter( table.newSymbol( "T", TypeInfo.t_templateParameter ) );
 		T = template2.lookup( "T" );
 		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 );
 		table.getCompilationUnit().addSymbol( template2 );
 		
@@ -1465,7 +1466,7 @@
 		List params = new LinkedList();
 		params.add( new TypeInfo( TypeInfo.t_type, 0, x ) );
 		try{
-			ISymbol look = table.getCompilationUnit().unqualifiedFunctionLookup( "g", params );
+			table.getCompilationUnit().unqualifiedFunctionLookup( "g", params );
 			assertTrue( false );
 		} catch( ParserSymbolTableException e ){
 			assertEquals( e.reason, ParserSymbolTableException.r_Ambiguous );
@@ -1500,7 +1501,7 @@
 		template1.addTemplateParameter( table.newSymbol( "T", TypeInfo.t_templateParameter ) );
 		ISymbol T = template1.lookup( "T" );
 		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 );
 		table.getCompilationUnit().addSymbol( template1 );
 		
@@ -1511,7 +1512,7 @@
 		IParameterizedSymbol h2 = table.newParameterizedSymbol( "h", TypeInfo.t_function );
 		List argList = new LinkedList();
 		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 );
 		table.getCompilationUnit().addSymbol( template2 );
@@ -1535,7 +1536,7 @@
 		assertTrue( look.isTemplateInstance() );
 		assertEquals( look.getInstantiatedSymbol(), A );
 		z2.setTypeSymbol( look );
-		z2.addPtrOperator( new PtrOp( PtrOp.t_undef, true, false ) );
+		z2.getTypeInfo().setBit( true, TypeInfo.isConst );
 		
 		params.clear();
 		params.add( new TypeInfo( TypeInfo.t_type, 0, z2 ) );
@@ -1789,12 +1790,12 @@
 		ISymbol U = template.lookup( "U" );
 		
 		paramFunction.setReturnType( T );
-		paramFunction.addParameter( T, null, false );
-		paramFunction.addParameter( U, null, false );
-		paramFunction.addParameter( U, null, false );
+		paramFunction.addParameter( T, 0, null, false );
+		paramFunction.addParameter( U, 0, null, false );
+		paramFunction.addParameter( U, 0, null, false );
 		
 		IParameterizedSymbol f = table.newParameterizedSymbol( "f", TypeInfo.t_function );
-		f.addParameter( paramFunction, null, false );
+		f.addParameter( paramFunction, 0, null, false );
 		
 		template.addSymbol( f );
 		
@@ -1857,7 +1858,7 @@
 		template.addTemplateParameter( T );
 		
 		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 );
 		
 		table.getCompilationUnit().addSymbol( template );
Index: parser/org/eclipse/cdt/core/parser/tests/ParserSymbolTableTest.java
===================================================================
retrieving revision 1.35
diff -u -r1.35 ParserSymbolTableTest.java
--- parser/org/eclipse/cdt/core/parser/tests/ParserSymbolTableTest.java	11 Feb 2004 03:07:33 -0000	1.35
+++ parser/org/eclipse/cdt/core/parser/tests/ParserSymbolTableTest.java	12 Feb 2004 22:17:20 -0000
@@ -1188,10 +1188,9 @@
 		
 		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.getTypeInfo().addPtrOperator( new PtrOp( PtrOp.t_undef, true, false ) );
-		//fn.setCVQualifier( ParserSymbolTable.TypeInfo.cvConst );
+		fn.getTypeInfo().setBit( true, TypeInfo.isConst );
 		
 		table.getCompilationUnit().addSymbol( cls );
 		cls.addSymbol( fn );
@@ -1201,8 +1200,9 @@
 		
 		assertEquals( look.getType(), TypeInfo.t_type );
 		assertEquals( look.getTypeSymbol(), cls );
+		assertTrue( look.getTypeInfo().checkBit( TypeInfo.isConst ) );
 		assertEquals( ((PtrOp)look.getPtrOperators().iterator().next()).getType(), TypeInfo.PtrOp.t_pointer );
-		assertTrue( ((PtrOp)look.getPtrOperators().iterator().next()).isConst() );
+		
 		assertEquals( look.getContainingSymbol(), fn );
 	}
 	
@@ -1270,7 +1270,7 @@
 		
 		ISymbol look = NS.lookup( "T" );
 		assertEquals( look, T );				
-		f.addParameter( look, null, false );
+		f.addParameter( look, 0, null, false );
 		
 		NS.addSymbol( f );	
 				
@@ -1433,7 +1433,7 @@
 		f3.setReturnType( table.newSymbol( "", TypeInfo.t_void ) );
 		f3.addParameter( TypeInfo.t_int, 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 );
 		
 		ISymbol look = compUnit.lookup("C");
@@ -1556,12 +1556,12 @@
 		
 		IParameterizedSymbol f1 = table.newParameterizedSymbol( "f" );
 		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 );
 		
 		IParameterizedSymbol f2 = table.newParameterizedSymbol( "f" );
 		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 );
 		
 		ISymbol a = table.newSymbol( "a" );
@@ -1625,12 +1625,12 @@
 		
 		IParameterizedSymbol f1 = table.newParameterizedSymbol( "f" );
 		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 );
 		
 		IParameterizedSymbol f2 = table.newParameterizedSymbol( "f" );
 		f2.setType( TypeInfo.t_function );
-		f2.addParameter( A, null, false );
+		f2.addParameter( A, 0, null, false );
 		compUnit.addSymbol( f2 );
 
 		ISymbol a = table.newSymbol( "a" );
@@ -1706,12 +1706,12 @@
 		
 		IParameterizedSymbol constructor = table.newParameterizedSymbol("B");
 		constructor.setType( TypeInfo.t_constructor );
-		constructor.addParameter( A, null, false );
+		constructor.addParameter( A, 0, null, false );
 		B.addConstructor( constructor );
 		
 		IParameterizedSymbol f = table.newParameterizedSymbol( "f" );
 		f.setType( TypeInfo.t_function );
-		f.addParameter( B, null, false );
+		f.addParameter( B, 0, null, false );
 		compUnit.addSymbol( f );
 		
 		ISymbol a = table.newSymbol( "a" );
@@ -1744,7 +1744,7 @@
 	 * 	  					//and 1L->short and 1L->int are indistinguishable
 	 * 	  f( &i, 'c' );		//calls f( int*, int) because &i->int * is better than &i->const int *
 	 * 	  					//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
 	 * }
 	 */
@@ -1755,7 +1755,7 @@
 		
 		IParameterizedSymbol f1 = table.newParameterizedSymbol( "f" );
 		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 );
 		
 		compUnit.addSymbol( f1 );
@@ -1810,13 +1810,12 @@
 		assertEquals( look, f2 );
 		
 		params.clear();
-		p1.addPtrOperator( new PtrOp( PtrOp.t_undef, true, false ) );
-		//((PtrOp)p1.getPtrOperators().iterator().next()).setConst( true );
+		p1 = new TypeInfo( TypeInfo.t_int, TypeInfo.isConst, null, new PtrOp( PtrOp.t_pointer, false, false ), false );
+		
 		params.add( p1 );
 		params.add( p3 );
 		look = main.unqualifiedFunctionLookup( "f", params );
 		assertEquals( look, f1 );
-		
 	}
 	
 	/**
@@ -1859,7 +1858,7 @@
 		
 		IParameterizedSymbol constructA = table.newParameterizedSymbol( "A" );
 		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 );
 		
 		IParameterizedSymbol operator = table.newParameterizedSymbol( "operator A" );
@@ -1868,7 +1867,7 @@
 		
 		IParameterizedSymbol f1 = table.newParameterizedSymbol( "f" );
 		f1.setType( TypeInfo.t_function );
-		f1.addParameter( A, null, false );
+		f1.addParameter( A, 0, null, false );
 		compUnit.addSymbol( f1 );
 		
 		ISymbol b = table.newSymbol( "b" );
@@ -1894,12 +1893,12 @@
 		
 		IParameterizedSymbol constructC = table.newParameterizedSymbol("C");
 		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 );
 
 		IParameterizedSymbol f2 = table.newParameterizedSymbol( "f" );
 		f2.setType( TypeInfo.t_function );
-		f2.addParameter(  C, null, false );
+		f2.addParameter(  C, 0, null, false );
 		compUnit.addSymbol( f2 );
 		
 		try{
@@ -1911,7 +1910,7 @@
 		
 		IParameterizedSymbol f3 = table.newParameterizedSymbol( "f" );
 		f3.setType( TypeInfo.t_function );
-		f3.addParameter(  B, null, false );
+		f3.addParameter(  B, 0, null, false );
 		compUnit.addSymbol( f3 );
 		
 		look = compUnit.unqualifiedFunctionLookup( "f", params );
@@ -2056,7 +2055,7 @@
 		IParameterizedSymbol fn1 = table.newParameterizedSymbol( "f", TypeInfo.t_function );
 		ISymbol lookup = table.getCompilationUnit().lookup( "A" );
 		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 );
 		classB.addSymbol( fn1 );
 		
@@ -2115,7 +2114,7 @@
 		IDerivableContainerSymbol classA = table.newDerivableContainerSymbol( "A", TypeInfo.t_class );
 		
 		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 );
 		constructor2.addParameter( TypeInfo.t_int, 0, null, false );
@@ -2234,7 +2233,7 @@
 		IDerivableContainerSymbol a = table.newDerivableContainerSymbol( "A", TypeInfo.t_class );
 		table.getCompilationUnit().addSymbol( a );
 		
-		f.addParameter( a, null, false );
+		f.addParameter( a, 0, null, false );
 		
 		table.getCompilationUnit().addSymbol( f );
 		
@@ -2313,11 +2312,11 @@
 		assertEquals( returned, null );
 		
 		IParameterizedSymbol constructorA = table.newParameterizedSymbol( "A", TypeInfo.t_constructor );
-		constructorA.addParameter( clsC, null, false );
+		constructorA.addParameter( clsC, 0, null, false );
 		clsA.addConstructor( constructorA );
 		
 		IParameterizedSymbol constructorC = table.newParameterizedSymbol( "C", TypeInfo.t_constructor );
-		constructorC.addParameter( clsA, null, false );
+		constructorC.addParameter( clsA, 0, null, false );
 		clsC.addConstructor( constructorC );
 		
 		secondOp.getOperatorExpressions().clear();
@@ -2369,7 +2368,7 @@
 		table.getCompilationUnit().addSymbol( c );
 		
 		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 );
 		
 		LinkedList parameters = new LinkedList();
@@ -2380,7 +2379,7 @@
 		assertEquals( look, f1 );
 		
 		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 );
 		
 		look = table.getCompilationUnit().unqualifiedFunctionLookup( "f", parameters );
@@ -3280,6 +3279,81 @@
 		look = table.getCompilationUnit().unqualifiedFunctionLookup( "f", params );
 		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 ) );
 	}
 }
 

Back to the top