Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
[cdt-patch] Fix ParserSymbolTable bugs

Core :
        - modified Symbol table interfaces to use List & Map instead of 
LinkedList and HashMap
        - fixed warnings in ParserSymbolTable
        - fixed bug43106 - Symbol Table support needed to resolve types
        - fixed bug43156 - require ability to add implicit inheritance 
copy constructor
        - fixed bug43159 - TypeInfo.equals() not working properly
        - fixed bug43238 - Postfix_Subscript expressions confuse function 
resolution

Tests:
        - removed testConditionalExpression_Bug43159 from 
FailedCompleteParseASTExpressionTest
          and uncommented it (testConditionalExpression) in 
CompleteParseASTExpressionTest
        - uncommented the following tests in 
CompleteParseASTExpressionTest :
            testPostfixSubscript, 
            testPostfixSubscriptA, 
            testPostfixSubscriptB,
            testPostfixSubscriptWithReferences
        - updated ParserSymbolTableTests to use new addOperatorExpression 
function
        - added testDerivedReference, testAddCopyConstructor to 
ParserSymbolTableTests
        - fixed warning in ClassDeclarationPatternTests

Andrew

Index: parser/ChangeLog
===================================================================
RCS file: /home/tools/org.eclipse.cdt.core/parser/ChangeLog,v
retrieving revision 1.132
diff -u -r1.132 ChangeLog
--- parser/ChangeLog	18 Sep 2003 15:22:48 -0000	1.132
+++ parser/ChangeLog	18 Sep 2003 18:47:05 -0000
@@ -1,3 +1,11 @@
+2003-09-18 Andrew Niefer
+	- modified Symbol table interfaces to use Lists & Maps instead of LinkedList and HashMap
+	- fixed warnings in ParserSymbolTable
+	- fixed bug43106 - Symbol Table support needed to resolve types
+	- fixed bug43156 - require ability to add implicit inheritance copy constructor
+	- fixed bug43159 - TypeInfo.equals() not working properly
+	- fixed bug43238 - Postfix_Subscript expressions confuse function resolution
+
 2003-09-16 Andrew Niefer
 	- added setThrowExceptionOnBadCharacterRead to IScanner to help with wildcard bug43063
 
Index: parser/org/eclipse/cdt/internal/core/parser/ast/complete/CompleteParseASTFactory.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/complete/CompleteParseASTFactory.java,v
retrieving revision 1.42
diff -u -r1.42 CompleteParseASTFactory.java
--- parser/org/eclipse/cdt/internal/core/parser/ast/complete/CompleteParseASTFactory.java	18 Sep 2003 15:22:48 -0000	1.42
+++ parser/org/eclipse/cdt/internal/core/parser/ast/complete/CompleteParseASTFactory.java	18 Sep 2003 18:47:06 -0000
@@ -1058,7 +1058,7 @@
 			if( lhsResult.iterator().hasNext())
 				info = (TypeInfo)lhsResult.iterator().next();
 			if ((info != null) && (info.getTypeSymbol() != null)){
-				info.addPtrOperator(new TypeInfo.PtrOp(TypeInfo.PtrOp.t_reference));				
+				info.addOperatorExpression( TypeInfo.OperatorExpression.addressof );
 			}
 			result.add(info);
 			return result;
@@ -1069,22 +1069,22 @@
 			if( lhsResult.iterator().hasNext())
 				info = (TypeInfo)lhsResult.iterator().next();
 			if ((info != null)&& (info.getTypeSymbol() != null)){
-				info.addPtrOperator(new TypeInfo.PtrOp(TypeInfo.PtrOp.t_pointer));				
+				info.addOperatorExpression( TypeInfo.OperatorExpression.indirection );
 			}
 			result.add(info);
 			return result;
 		}
 		// subscript
-//		if (expression.getExpressionKind() == IASTExpression.Kind.POSTFIX_SUBSCRIPT){
-//			List lhsResult = ((ASTExpression)expression.getLHSExpression()).getResultType();
-//			if( lhsResult.iterator().hasNext())
-//				info = (TypeInfo)lhsResult.iterator().next();
-//			if ((info != null) && (info.getTypeSymbol() != null)){
-//				info.addPtrOperator(new TypeInfo.PtrOp(TypeInfo.PtrOp.t_pointer));				
-//			}
-//			result.add(info);
-//			return result;
-//		}
+		if (expression.getExpressionKind() == IASTExpression.Kind.POSTFIX_SUBSCRIPT){
+			List lhsResult = ((ASTExpression)expression.getLHSExpression()).getResultType();
+			if( lhsResult.iterator().hasNext())
+				info = (TypeInfo)lhsResult.iterator().next();
+			if ((info != null) && (info.getTypeSymbol() != null)){
+				info.addOperatorExpression( TypeInfo.OperatorExpression.subscript );
+			}
+			result.add(info);
+			return result;
+		}
 		// the dot and the arrow resolves to the type of the member
 		if ((expression.getExpressionKind() == IASTExpression.Kind.POSTFIX_DOT_IDEXPRESSION)
 		|| (expression.getExpressionKind() == IASTExpression.Kind.POSTFIX_ARROW_IDEXPRESSION)
@@ -1105,7 +1105,7 @@
 			if( rhsResult.iterator().hasNext())
 				info = (TypeInfo)rhsResult.iterator().next();
 			if (info != null){
-				info.addPtrOperator(new TypeInfo.PtrOp(TypeInfo.PtrOp.t_pointer));				
+				info.addOperatorExpression( TypeInfo.OperatorExpression.indirection );
 			}
 			if(symbol != null){
 				info.setTypeSymbol(symbol);
@@ -1119,7 +1119,7 @@
 			{
 				info.setType(TypeInfo.t_type);
 				info.setTypeSymbol(symbol);	
-				info.addPtrOperator(new TypeInfo.PtrOp(TypeInfo.PtrOp.t_reference));		
+				info.addOperatorExpression( TypeInfo.OperatorExpression.addressof );
 				result.add(info);
 				return result;
 			}
Index: parser/org/eclipse/cdt/internal/core/parser/pst/IContainerSymbol.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/pst/IContainerSymbol.java,v
retrieving revision 1.5
diff -u -r1.5 IContainerSymbol.java
--- parser/org/eclipse/cdt/internal/core/parser/pst/IContainerSymbol.java	28 Aug 2003 15:50:31 -0000	1.5
+++ parser/org/eclipse/cdt/internal/core/parser/pst/IContainerSymbol.java	18 Sep 2003 18:47:06 -0000
@@ -16,7 +16,6 @@
  */
 package org.eclipse.cdt.internal.core.parser.pst;
 
-import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
 
@@ -47,9 +46,9 @@
 	public IContainerSymbol lookupNestedNameSpecifier( String name ) throws ParserSymbolTableException;
 	public ISymbol qualifiedLookup( String name ) throws ParserSymbolTableException;
 	public ISymbol qualifiedLookup( String name, TypeInfo.eType t ) throws ParserSymbolTableException;
-	public IParameterizedSymbol unqualifiedFunctionLookup( String name, LinkedList parameters ) throws ParserSymbolTableException;
-	public IParameterizedSymbol memberFunctionLookup( String name, LinkedList parameters ) throws ParserSymbolTableException;
-	public IParameterizedSymbol qualifiedFunctionLookup( String name, LinkedList parameters ) throws ParserSymbolTableException;
-	public TemplateInstance templateLookup( String name, LinkedList arguments ) throws ParserSymbolTableException;
-	public TemplateInstance instantiate( LinkedList arguments ) throws ParserSymbolTableException;
+	public IParameterizedSymbol unqualifiedFunctionLookup( String name, List parameters ) throws ParserSymbolTableException;
+	public IParameterizedSymbol memberFunctionLookup( String name, List parameters ) throws ParserSymbolTableException;
+	public IParameterizedSymbol qualifiedFunctionLookup( String name, List parameters ) throws ParserSymbolTableException;
+	public TemplateInstance templateLookup( String name, List arguments ) throws ParserSymbolTableException;
+	public TemplateInstance instantiate( List arguments ) throws ParserSymbolTableException;
 }
Index: parser/org/eclipse/cdt/internal/core/parser/pst/IDerivableContainerSymbol.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/pst/IDerivableContainerSymbol.java,v
retrieving revision 1.5
diff -u -r1.5 IDerivableContainerSymbol.java
--- parser/org/eclipse/cdt/internal/core/parser/pst/IDerivableContainerSymbol.java	7 Aug 2003 14:46:58 -0000	1.5
+++ parser/org/eclipse/cdt/internal/core/parser/pst/IDerivableContainerSymbol.java	18 Sep 2003 18:47:06 -0000
@@ -16,7 +16,6 @@
  */
 package org.eclipse.cdt.internal.core.parser.pst;
 
-import java.util.LinkedList;
 import java.util.List;
 
 import org.eclipse.cdt.core.parser.ast.ASTAccessVisibility;
@@ -35,13 +34,15 @@
 	public boolean hasParents();
 	
 	public void addConstructor( IParameterizedSymbol constructor ) throws ParserSymbolTableException;
-	public IParameterizedSymbol lookupConstructor( LinkedList parameters ) throws ParserSymbolTableException;
-	public LinkedList getConstructors();
+	public void addCopyConstructor() throws ParserSymbolTableException;
+	public IParameterizedSymbol lookupConstructor( List parameters ) throws ParserSymbolTableException;
+	public List getConstructors();
 	
 	public interface IParentSymbol{
 		public void setParent( ISymbol parent );
 		public ISymbol getParent();
 		public boolean isVirtual();
 		public void setVirtual( boolean virtual );
+		public ASTAccessVisibility  getVisibility();
 	}
 }
Index: parser/org/eclipse/cdt/internal/core/parser/pst/IParameterizedSymbol.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/pst/IParameterizedSymbol.java,v
retrieving revision 1.3
diff -u -r1.3 IParameterizedSymbol.java
--- parser/org/eclipse/cdt/internal/core/parser/pst/IParameterizedSymbol.java	22 Jul 2003 22:02:20 -0000	1.3
+++ parser/org/eclipse/cdt/internal/core/parser/pst/IParameterizedSymbol.java	18 Sep 2003 18:47:06 -0000
@@ -16,8 +16,8 @@
  */
 package org.eclipse.cdt.internal.core.parser.pst;
 
-import java.util.HashMap;
-import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
 
 
 /**
@@ -33,12 +33,12 @@
 	public void addParameter( ISymbol typeSymbol, TypeInfo.PtrOp ptrOp, boolean hasDefault );
 	
 	public void addArgument( ISymbol arg );
-	public LinkedList getArgumentList();
-	public void setArgumentList( LinkedList list );
+	public List getArgumentList();
+	public void setArgumentList( List list );
 	
-	public HashMap getParameterMap();
-	public LinkedList getParameterList();
-	public void setParameterList( LinkedList list );
+	public Map getParameterMap();
+	public List getParameterList();
+	public void setParameterList( List list );
 
 	public boolean hasSameParameters(IParameterizedSymbol newDecl);
 	
@@ -47,5 +47,5 @@
 	
 	public boolean	hasSpecializations();
 	public void 	addSpecialization( IParameterizedSymbol spec );
-	public LinkedList getSpecializations();	
+	public List 	getSpecializations();	
 }
Index: parser/org/eclipse/cdt/internal/core/parser/pst/ISymbol.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/pst/ISymbol.java,v
retrieving revision 1.6
diff -u -r1.6 ISymbol.java
--- parser/org/eclipse/cdt/internal/core/parser/pst/ISymbol.java	1 Aug 2003 17:43:10 -0000	1.6
+++ parser/org/eclipse/cdt/internal/core/parser/pst/ISymbol.java	18 Sep 2003 18:47:06 -0000
@@ -10,8 +10,8 @@
 ***********************************************************************/
 package org.eclipse.cdt.internal.core.parser.pst;
 
-import java.util.HashMap;
-import java.util.LinkedList;
+import java.util.Map;
+import java.util.List;
 
 import org.eclipse.cdt.internal.core.parser.pst.ParserSymbolTable.TemplateInstance;
 /**
@@ -45,40 +45,15 @@
 	public void setIsForwardDeclaration( boolean forward );
 	
 	public int compareCVQualifiersTo( ISymbol symbol );
-	public LinkedList getPtrOperators();
+	public List getPtrOperators();
 	public void addPtrOperator( TypeInfo.PtrOp ptrOp );
 	
 	public boolean isTemplateMember();
 	public void setIsTemplateMember( boolean isMember );
 	public ISymbol getTemplateInstance();
-	public HashMap getArgumentMap();
+	public Map getArgumentMap();
 	public void setTemplateInstance( TemplateInstance instance );
-	
-	/*public interface ITypeInfo {
-		public boolean checkBit(int mask);
-		public void setBit(boolean b, int mask);
-		public boolean isType( int type );
-		public boolean isType( int type, int upperType );	
-		public int getType();
-		public ISymbol getTypeSymbol();
-		
-		public int getCVQualifier();
-		public void addCVQualifier( int cvQual ); 
-		public String getPtrOperator();
-		public void addPtrOperator( String ptrOp );
-		public void setType(int i);
-		public void setTypeSymbol(ISymbol typeSymbol);
-	
-		public int getTypeInfo();
-		public void setTypeInfo( int typeInfo );
-		public void setPtrOperator(String string);
-		public boolean canHold(ITypeInfo src);
-		public String getInvertedPtrOperator();
-		public void setCVQualifier(int i);
-		public boolean getHasDefault();
-		public void setHasDefault(boolean hasDefault);				
-	}
-	*/
+
 	public int getDepth();
 
     /**
Index: parser/org/eclipse/cdt/internal/core/parser/pst/ParserSymbolTable.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/pst/ParserSymbolTable.java,v
retrieving revision 1.20
diff -u -r1.20 ParserSymbolTable.java
--- parser/org/eclipse/cdt/internal/core/parser/pst/ParserSymbolTable.java	15 Sep 2003 21:50:00 -0000	1.20
+++ parser/org/eclipse/cdt/internal/core/parser/pst/ParserSymbolTable.java	18 Sep 2003 18:47:06 -0000
@@ -24,6 +24,7 @@
 
 import org.eclipse.cdt.core.parser.ParserLanguage;
 import org.eclipse.cdt.core.parser.ast.ASTAccessVisibility;
+import org.eclipse.cdt.internal.core.parser.pst.TypeInfo.PtrOp;
 
 /**
  * @author aniefer
@@ -31,12 +32,15 @@
 
 public class ParserSymbolTable {
 
+	public static final String EMPTY_NAME = ""; //$NON-NLS-1$
+	public static final String THIS = "this";	//$NON-NLS-1$
+	
 	/**
 	 * Constructor for ParserSymbolTable.
 	 */
 	public ParserSymbolTable( ParserLanguage language ) {
 		super();
-		_compilationUnit = new Declaration("");
+		_compilationUnit = new Declaration(EMPTY_NAME);
 		_compilationUnit.setType( TypeInfo.t_namespace );
 		_language = language;
 	}
@@ -346,7 +350,7 @@
 		}
 		
 		List scopes = container.getParents();
-		boolean foundSomething = false;
+
 		ISymbol temp = null;
 		ISymbol symbol = null;
 		
@@ -472,9 +476,9 @@
 		return false;
 	}
 	
-	protected static boolean isValidOverload( LinkedList origList, ISymbol newSymbol ){
+	protected static boolean isValidOverload( List origList, ISymbol newSymbol ){
 		if( origList.size() == 1 ){
-			return isValidOverload( (ISymbol)origList.getFirst(), newSymbol );
+			return isValidOverload( (ISymbol)origList.iterator().next(), newSymbol );
 		} else if ( origList.size() > 1 ){
 
 			//the first thing can be a class-name or enumeration name, but the rest
@@ -667,7 +671,7 @@
 		}
 	}
 
-	static protected IParameterizedSymbol resolveFunction( LookupData data, LinkedList functions ) throws ParserSymbolTableException{
+	static protected IParameterizedSymbol resolveFunction( LookupData data, List functions ) throws ParserSymbolTableException{
 		if( functions == null ){
 			return null;
 		}
@@ -683,7 +687,7 @@
 			if( numFns == 0 ){
 				return null;
 			} else if ( numFns == 1 ){
-				return (IParameterizedSymbol)functions.getFirst();
+				return (IParameterizedSymbol)functions.iterator().next();
 			} else{
 				throw new ParserSymbolTableException( ParserSymbolTableException.r_Ambiguous );
 			}
@@ -805,7 +809,7 @@
 		return bestFn;
 	}
 	
-	static private void reduceToViable( LookupData data, LinkedList functions ){
+	static private void reduceToViable( LookupData data, List functions ){
 		int numParameters = ( data.parameters == null ) ? 0 : data.parameters.size();
 		int num;	
 			
@@ -930,7 +934,11 @@
 	 * 
 	 * TBD: Consider rewriting iteratively for performance.
 	 */
-	static private int hasBaseClass( ISymbol obj, ISymbol base ){
+	static private int hasBaseClass( ISymbol obj, ISymbol base ) throws ParserSymbolTableException {
+		return hasBaseClass( obj, base, false );
+	}
+	
+	static private int hasBaseClass( ISymbol obj, ISymbol base, boolean throwIfNotVisible ) throws ParserSymbolTableException{
 		if( obj == base ){
 			return 0;
 		}
@@ -961,14 +969,17 @@
 			for( int i = size; i > 0; i-- ){
 				wrapper = (IDerivableContainerSymbol.IParentSymbol) iter.next();	
 				temp = wrapper.getParent();
-				
+				boolean isVisible = ( wrapper.getVisibility() == ASTAccessVisibility.PUBLIC );
 				if( temp instanceof TemplateInstance ){
 					instance = (TemplateInstance) temp;
 					if( instance.getInstantiatedSymbol() instanceof IDerivableContainerSymbol ){
 						if( instance.getInstantiatedSymbol() == base ){
-							return 1;
+							if( throwIfNotVisible && !isVisible )
+								throw new ParserSymbolTableException( ParserSymbolTableException.r_BadVisibility );
+							else 
+								return 1;
 						} else {
-							int n = hasBaseClass( instance, base );
+							int n = hasBaseClass( instance, base, throwIfNotVisible );
 							if( n > 0 ){
 								return n + 1;
 							}	
@@ -989,9 +1000,12 @@
 						continue; 
 					}
 					if( parent == base ){
-						return 1;
+						if( throwIfNotVisible && !isVisible )
+							throw new ParserSymbolTableException( ParserSymbolTableException.r_BadVisibility );
+						else 
+							return 1;
 					} else {
-						int n = hasBaseClass( parent, base );
+						int n = hasBaseClass( parent, base, throwIfNotVisible );
 						if( n > 0 ){
 							return n + 1;
 						}
@@ -1057,23 +1071,28 @@
 		//7.3.3-4
 		else if( context.isType( TypeInfo.t_class, TypeInfo.t_struct ) ){
 			IContainerSymbol container = obj.getContainingSymbol();
-			//a member of a base class
-			if( obj.getContainingSymbol().getType() == context.getType() ){
-				okToAdd = ( hasBaseClass( (IDerivableContainerSymbol) context, (IDerivableContainerSymbol) container ) > 0 );		
-			} 
-			else if ( obj.getContainingSymbol().getType() == TypeInfo.t_union ) {
-				// TODO : must be an _anonymous_ union
-				container = container.getContainingSymbol();
-				okToAdd = ( container instanceof IDerivableContainerSymbol ) 
-						  ? ( hasBaseClass( (IDerivableContainerSymbol)context, (IDerivableContainerSymbol) container ) > 0 )
-						  : false; 
-			}
-			//an enumerator for an enumeration
-			else if ( obj.getType() == TypeInfo.t_enumerator ){
-				container = container.getContainingSymbol();
-				okToAdd = ( container instanceof IDerivableContainerSymbol ) 
-						  ? ( hasBaseClass( (IDerivableContainerSymbol)context, (IDerivableContainerSymbol) container ) > 0 )
-						  : false; 
+			
+			try{
+				//a member of a base class
+				if( obj.getContainingSymbol().getType() == context.getType() ){
+					okToAdd = ( hasBaseClass( (IDerivableContainerSymbol) context, (IDerivableContainerSymbol) container ) > 0 );		
+				} 
+				else if ( obj.getContainingSymbol().getType() == TypeInfo.t_union ) {
+					// TODO : must be an _anonymous_ union
+					container = container.getContainingSymbol();
+					okToAdd = ( container instanceof IDerivableContainerSymbol ) 
+							  ? ( hasBaseClass( (IDerivableContainerSymbol)context, (IDerivableContainerSymbol) container ) > 0 )
+							  : false; 
+				}
+				//an enumerator for an enumeration
+				else if ( obj.getType() == TypeInfo.t_enumerator ){
+					container = container.getContainingSymbol();
+					okToAdd = ( container instanceof IDerivableContainerSymbol ) 
+							  ? ( hasBaseClass( (IDerivableContainerSymbol)context, (IDerivableContainerSymbol) container ) > 0 )
+							  : false; 
+				}
+			} catch ( ParserSymbolTableException e ) {
+				//not going to happen since we didn't ask for the visibility exception from hasBaseClass				
 			}
 		} else {
 			okToAdd = true;
@@ -1109,11 +1128,11 @@
 		TypeInfo.PtrOp op = null;
 		
 		if( cost.source.hasPtrOperators() ){
-			LinkedList sourcePtrs = cost.source.getPtrOperators();
-			TypeInfo.PtrOp ptr = (TypeInfo.PtrOp)sourcePtrs.getFirst();
-			
+			List sourcePtrs = cost.source.getPtrOperators();
+			Iterator iterator = sourcePtrs.iterator();
+			TypeInfo.PtrOp ptr = (TypeInfo.PtrOp)iterator.next();
 			if( ptr.getType() == TypeInfo.PtrOp.t_reference ){
-				sourcePtrs.removeFirst();
+				iterator.remove();
 			}
 			int size = sourcePtrs.size();
 			Iterator iter = sourcePtrs.iterator();
@@ -1127,11 +1146,13 @@
 		}
 		
 		if( cost.target.hasPtrOperators() ){
-			LinkedList targetPtrs = cost.target.getPtrOperators();
-			TypeInfo.PtrOp ptr = (TypeInfo.PtrOp)targetPtrs.getFirst();
-			
+			List targetPtrs = cost.target.getPtrOperators();
+			Iterator iterator = targetPtrs.iterator();
+			TypeInfo.PtrOp ptr = (TypeInfo.PtrOp)iterator.next();
+
 			if( ptr.getType() == TypeInfo.PtrOp.t_reference ){
-				targetPtrs.removeFirst();
+				iterator.remove();
+				cost.targetHadReference = true;
 			}
 			int size = targetPtrs.size();
 			Iterator iter = targetPtrs.iterator();
@@ -1271,7 +1292,7 @@
 		TypeInfo src = cost.source;
 		TypeInfo trg = cost.target;
 		
-		int temp;
+		int temp = -1;
 		
 		cost.conversion = 0;
 		cost.detail = 0;
@@ -1280,7 +1301,7 @@
 			return;
 		} 
 		if( src.hasPtrOperators() && src.getPtrOperators().size() == 1 ){
-			TypeInfo.PtrOp ptr = (TypeInfo.PtrOp)src.getPtrOperators().getFirst();
+			TypeInfo.PtrOp ptr = (TypeInfo.PtrOp)src.getPtrOperators().iterator().next();
 			ISymbol srcDecl = src.isType( TypeInfo.t_type ) ? src.getTypeSymbol() : null;
 			ISymbol trgDecl = trg.isType( TypeInfo.t_type ) ? trg.getTypeSymbol() : null;
 			if( ptr.getType() == TypeInfo.PtrOp.t_pointer ){
@@ -1302,7 +1323,11 @@
 				//4.10-3 An rvalue of type "pointer to cv D", where D is a class type can be converted
 				// to an rvalue of type "pointer to cv B", where B is a base class of D.
 				if( (srcDecl instanceof IDerivableContainerSymbol) && trgDecl.isType( srcDecl.getType() ) ){
-					temp = hasBaseClass( (IDerivableContainerSymbol) srcDecl, (IDerivableContainerSymbol) trgDecl );
+					try {
+						temp = hasBaseClass( (IDerivableContainerSymbol) srcDecl, (IDerivableContainerSymbol) trgDecl );
+					} catch (ParserSymbolTableException e) {
+						//not going to happen since we didn't ask for the visibility exception
+					}
 					cost.rank = ( temp > -1 ) ? Cost.CONVERSION_RANK : Cost.NO_MATCH_RANK;
 					cost.conversion = ( temp > -1 ) ? temp : 0;
 					cost.detail = 1;
@@ -1316,9 +1341,13 @@
 					return;	
 				}
 
-				TypeInfo.PtrOp srcPtr =  trg.hasPtrOperators() ? (TypeInfo.PtrOp)trg.getPtrOperators().getFirst() : null;
+				TypeInfo.PtrOp srcPtr =  trg.hasPtrOperators() ? (TypeInfo.PtrOp)trg.getPtrOperators().iterator().next() : null;
 				if( trgDecl.isType( srcDecl.getType() ) && srcPtr != null && srcPtr.getType() == TypeInfo.PtrOp.t_memberPointer ){
-					temp = hasBaseClass( (IDerivableContainerSymbol)ptr.getMemberOf(), (IDerivableContainerSymbol)srcPtr.getMemberOf() );
+					try {
+						temp = hasBaseClass( (IDerivableContainerSymbol)ptr.getMemberOf(), (IDerivableContainerSymbol)srcPtr.getMemberOf() );
+					} catch (ParserSymbolTableException e) {
+						//not going to happen since we didn't ask for the visibility exception
+					}
 					cost.rank = ( temp > -1 ) ? Cost.CONVERSION_RANK : Cost.NO_MATCH_RANK;
 					cost.detail = 1;
 					cost.conversion = ( temp > -1 ) ? temp : 0;
@@ -1342,7 +1371,26 @@
 		}
 	}
 	
-	static private Cost checkStandardConversionSequence( TypeInfo source, TypeInfo target ){
+	static private void derivedToBaseConversion( Cost cost ) throws ParserSymbolTableException{
+		TypeInfo src = cost.source;
+		TypeInfo trg = cost.target;
+		
+		ISymbol srcDecl = src.isType( TypeInfo.t_type ) ? src.getTypeSymbol() : null;
+		ISymbol trgDecl = trg.isType( TypeInfo.t_type ) ? trg.getTypeSymbol() : null;
+		
+		if( !src.hasSamePtrs( trg ) || srcDecl == null || trgDecl == null || !cost.targetHadReference ){
+			return;
+		}
+		
+		int temp = hasBaseClass( (IDerivableContainerSymbol) srcDecl, (IDerivableContainerSymbol) trgDecl, true );
+		
+		if( temp > -1 ){
+			cost.rank = Cost.DERIVED_TO_BASE_CONVERSION;
+			cost.conversion = temp;
+		}
+	}
+	
+	static private Cost checkStandardConversionSequence( TypeInfo source, TypeInfo target ) throws ParserSymbolTableException{
 		Cost cost = lvalue_to_rvalue( source, target );
 		
 		if( cost.source == null || cost.target == null ){
@@ -1368,6 +1416,11 @@
 		
 		conversion( cost );
 		
+		if( cost.rank > -1 )
+			return cost;
+			
+		derivedToBaseConversion( cost );
+		
 		return cost;	
 	}
 	
@@ -1385,7 +1438,7 @@
 		if( target.getType() == TypeInfo.t_type ){
 			targetDecl = target.getTypeSymbol();
 			if( targetDecl.isType( TypeInfo.t_class, TypeInfo.t_union ) ){
-				LookupData data = new LookupData( "", TypeInfo.t_constructor, null );
+				LookupData data = new LookupData( EMPTY_NAME, TypeInfo.t_constructor, null );
 				data.parameters = new LinkedList();
 				data.parameters.add( source );
 				data.forUserDefinedConversion = true;
@@ -1415,8 +1468,8 @@
 			if( sourceDecl != null && (sourceDecl instanceof IContainerSymbol) ){
 				String name = target.toString();
 				
-				if( !name.equals("") ){
-					LookupData data = new LookupData( "operator " + name, TypeInfo.t_function, null );
+				if( !name.equals(EMPTY_NAME) ){
+					LookupData data = new LookupData( "operator " + name, TypeInfo.t_function, null ); //$NON-NLS-1$
 					LinkedList params = new LinkedList();
 					data.parameters = params;
 					data.forUserDefinedConversion = true;
@@ -1545,20 +1598,35 @@
 				returnInfo.setTypeInfo( info.getTypeInfo() );
 				returnInfo.setType( info.getType() );
 				returnInfo.setTypeSymbol( null );
+				returnInfo.addPtrOperator( info.getPtrOperators() );
 			}
 			
-			returnInfo.applyPtrsAsUnaryOperators( topInfo.getPtrOperators() );
+			returnInfo.applyOperatorExpressions( topInfo.getOperatorExpressions() );
+			
+			if( topInfo.hasPtrOperators() ){
+				TypeInfo.PtrOp topPtr = (PtrOp) topInfo.getPtrOperators().iterator().next();
+				TypeInfo.PtrOp ptr = null;
+				if( returnInfo.hasPtrOperators() ){
+					ptr = (PtrOp)returnInfo.getPtrOperators().iterator().next();
+				} else {
+					ptr = new PtrOp();
+					returnInfo.addPtrOperator( ptr );					
+				}
+				
+				ptr.setConst( topPtr.isConst() );
+				ptr.setVolatile( topPtr.isVolatile() );
+			}
 		}
 		
 		return returnInfo;	
 	}
 
-	static private IParameterizedSymbol matchTemplatePartialSpecialization( IParameterizedSymbol template, LinkedList args ){
+	static private IParameterizedSymbol matchTemplatePartialSpecialization( IParameterizedSymbol template, List args ){
 		if( template == null ){
 			return null;
 		}
 		
-		LinkedList specs = template.getSpecializations();
+		List specs = template.getSpecializations();
 		int size = ( specs != null ) ? specs.size() : 0;
 		if( size == 0 ){
 			return template;
@@ -1568,7 +1636,7 @@
 		boolean bestMatchIsBest = true;
 		Iterator iter = specs.iterator();
 		IParameterizedSymbol spec = null;
-		LinkedList specArgs = null;
+		List specArgs = null;
 		for( int i = size; i > 0; i-- ){
 			spec = (IParameterizedSymbol) iter.next();
 			specArgs = spec.getArgumentList();
@@ -1581,7 +1649,7 @@
 			Iterator iter2 = args.iterator();
 			
 			HashMap map = new HashMap();
-			String name = null;
+			//String name = null;
 			boolean match = true;
 			for( int j = specArgs.size(); j > 0; j-- ){
 				sym1 = (ISymbol)iter1.next();
@@ -1589,7 +1657,7 @@
 				if( info2.isType( TypeInfo.t_type ) ){
 					sym2 = sym2.getTypeSymbol(); 
 				} else {
-					sym2 = template.getSymbolTable().newSymbol( "" );
+					sym2 = template.getSymbolTable().newSymbol( EMPTY_NAME );
 					sym2.setTypeInfo( info2 );
 				}
 				
@@ -1694,7 +1762,7 @@
 			return false;
 		}
 		
-		LinkedList args = ((IParameterizedSymbol) argFunction).getParameterList();
+		List args = ((IParameterizedSymbol) argFunction).getParameterList();
 		
 		IParameterizedSymbol function = (IParameterizedSymbol) templateSymbol;
 		
@@ -1715,7 +1783,7 @@
 		return true;	
 	}
 	
-	static private boolean deduceTemplateArgument( HashMap map, ISymbol p, ISymbol a, HashMap argumentMap ){
+	static private boolean deduceTemplateArgument( Map map, ISymbol p, ISymbol a, Map argumentMap ){
 		if( argumentMap != null && argumentMap.containsKey( a ) ){
 			a = (ISymbol) argumentMap.get( a );
 		}
@@ -1730,12 +1798,12 @@
 			if( pSymbol.isTemplateMember() && pSymbol.isType( TypeInfo.t_undef ) ){
 				//T* or T& or T[ const ]
 				//also 
-				LinkedList pPtrs = pSymbol.getPtrOperators();
-				LinkedList aPtrs = aSymbol.getPtrOperators();
+				List pPtrs = pSymbol.getPtrOperators();
+				List aPtrs = aSymbol.getPtrOperators();
 				
 				if( pPtrs != null ){
-					TypeInfo.PtrOp pOp = (TypeInfo.PtrOp) pPtrs.getFirst();
-					TypeInfo.PtrOp aOp = ( aPtrs != null ) ? (TypeInfo.PtrOp)aPtrs.getFirst() : null;
+					TypeInfo.PtrOp pOp = (TypeInfo.PtrOp) pPtrs.iterator().next();;
+					TypeInfo.PtrOp aOp = ( aPtrs != null ) ? (TypeInfo.PtrOp)pPtrs.iterator().next() : null;
 					
 					if( pOp != null && aOp != null && pOp.getType() == aOp.getType() ){
 						if( pOp.getType() == TypeInfo.PtrOp.t_memberPointer ){
@@ -1759,8 +1827,8 @@
 			} 
 			//template-name<T> or template-name<i>
 			else if( pSymbol.isType( TypeInfo.t_template ) && aSymbol.isType( TypeInfo.t_template ) ){
-				LinkedList pArgs = ((IParameterizedSymbol)pSymbol).getArgumentList();
-				LinkedList aArgs = ((IParameterizedSymbol)aSymbol).getArgumentList();
+				List pArgs = ((IParameterizedSymbol)pSymbol).getArgumentList();
+				List aArgs = ((IParameterizedSymbol)aSymbol).getArgumentList();
 				
 				if( pArgs == null || aArgs == null || pArgs.size() != aArgs.size()){
 					return false;				
@@ -1782,8 +1850,8 @@
 					return false;
 				}
 				if( pSymbol.getPtrOperators() != null ){
-					LinkedList ptrs = pSymbol.getPtrOperators();
-					TypeInfo.PtrOp op = (TypeInfo.PtrOp) ptrs.getFirst();
+					List ptrs = pSymbol.getPtrOperators();
+					TypeInfo.PtrOp op = (TypeInfo.PtrOp) ptrs.iterator().next();;
 					if( op.getType() == TypeInfo.PtrOp.t_memberPointer ){
 						if( !deduceTemplateArgument( map, op.getMemberOf(), pFunction.getContainingSymbol(), argumentMap ) ){
 							return false;
@@ -1791,8 +1859,8 @@
 					}
 				}
 				
-				LinkedList pParams = pFunction.getParameterList();
-				LinkedList aParams = aFunction.getParameterList();
+				List pParams = pFunction.getParameterList();
+				List aParams = aFunction.getParameterList();
 				if( pParams.size() != aParams.size() ){
 					return false;
 				} else {
@@ -1861,7 +1929,7 @@
 	 */
 	static private TemplateInstance transformFunctionTemplateForOrdering( IParameterizedSymbol template ){
 		
-		LinkedList paramList = template.getParameterList();
+		List paramList = template.getParameterList();
 		
 		int size = ( paramList != null ) ? paramList.size() : 0;  
 		if( size == 0 ){
@@ -1871,7 +1939,7 @@
 		HashMap map = new HashMap();
 		for( Iterator iterator = paramList.iterator(); iterator.hasNext(); ) {
 			ISymbol param = (ISymbol) iterator.next();
-			ISymbol val = template.getSymbolTable().newSymbol( "", TypeInfo.t_type );
+			ISymbol val = template.getSymbolTable().newSymbol( EMPTY_NAME, TypeInfo.t_type );
 			if( false /* is value */ ){
 				//val.getTypeInfo().setHasDefault()
 			}
@@ -1971,7 +2039,7 @@
 				_context.getContainedSymbols().remove( _decl.getName() );
 			}
 			if( _removeThis && _decl instanceof IParameterizedSymbol ){
-				((IParameterizedSymbol)_decl).getContainedSymbols().remove( "this" );
+				((IParameterizedSymbol)_decl).getContainedSymbols().remove( THIS );
 			}
 		}
 		
@@ -1987,7 +2055,7 @@
 			_removeThis = removeThis;
 		}
 		public void undoIt(){
-			LinkedList constructors = _context.getConstructors();
+			List constructors = _context.getConstructors();
 			ListIterator iter = constructors.listIterator();
 			
 			int size = constructors.size();
@@ -2001,7 +2069,7 @@
 			}
 			
 			if( _removeThis ){
-				_constructor.getContainedSymbols().remove( "this" );
+				_constructor.getContainedSymbols().remove( THIS );
 			}
 		}
 	
@@ -2035,7 +2103,7 @@
 			_decl.getParameterList().remove( _param );
 			
 			String name = _param.getName();
-			if( name != null && !name.equals("") )
+			if( name != null && !name.equals(EMPTY_NAME) )
 			{	
 				_decl.getParameterMap().remove( name );
 			}
@@ -2079,7 +2147,7 @@
 		
 		public HashSet inheritanceChain;		//used to detect circular inheritance
 		
-		public LinkedList parameters;			//parameter info for resolving functions
+		public List parameters;			//parameter info for resolving functions
 		public HashSet associated;				//associated namespaces for argument dependant lookup
 		public ISymbol stopAt;					//stop looking along the stack once we hit this declaration
 				 
@@ -2102,14 +2170,17 @@
 	
 	static private class Cost
 	{
+		
 		public Cost( TypeInfo s, TypeInfo t ){
-			source = s;
-			target = t;
+			source = new TypeInfo( s );
+			target = new TypeInfo( t );
 		}
 		
 		public TypeInfo source;
 		public TypeInfo target;
 		
+		public boolean targetHadReference = false;
+		
 		public int lvalue;
 		public int promotion;
 		public int conversion;
@@ -2126,7 +2197,10 @@
 		public static final int LVALUE_OR_QUALIFICATION_RANK = 0;
 		public static final int PROMOTION_RANK = 1;
 		public static final int CONVERSION_RANK = 2;
-		public static final int USERDEFINED_CONVERSION_RANK = 3;
+		public static final int DERIVED_TO_BASE_CONVERSION = 3;
+		public static final int USERDEFINED_CONVERSION_RANK = 4;
+		public static final int ELLIPSIS_CONVERSION = 5;
+
 		
 		public int compare( Cost cost ){
 			int result = 0;
@@ -2318,7 +2392,6 @@
 	
 				TypeInfo.PtrOp op1 = null, op2 = null;
 	
-				int subOrSuper = 0;
 				for( int i = size; i > 0; i-- ){
 					op1 = (TypeInfo.PtrOp)iter1.next();
 					op2 = (TypeInfo.PtrOp)iter2.next();
@@ -2332,7 +2405,7 @@
 			return 0;
 		}
 		
-		public LinkedList getPtrOperators(){
+		public List getPtrOperators(){
 			return getTypeInfo().getPtrOperators();
 		}
 		public void addPtrOperator( TypeInfo.PtrOp ptrOp ){
@@ -2355,7 +2428,7 @@
 		public void setTemplateInstance( TemplateInstance instance ){
 			_templateInstance = instance;
 		}
-		public HashMap getArgumentMap(){
+		public Map getArgumentMap(){
 			return null;
 		}
 		private 	String 		_name;					//our name
@@ -2370,8 +2443,8 @@
 	
 	public class TemplateInstance extends BasicSymbol
 	{
-		protected TemplateInstance( ISymbol symbol, HashMap argMap ){
-			super("");
+		protected TemplateInstance( ISymbol symbol, Map argMap ){
+			super(EMPTY_NAME);
 			_instantiatedSymbol = symbol;
 			symbol.setTemplateInstance( this );
 			_argumentMap = argMap;
@@ -2471,16 +2544,14 @@
 			return _instantiatedSymbol.getTypeInfo();
 		}
 			
-		public HashMap getArgumentMap(){
+		public Map getArgumentMap(){
 			return _argumentMap;
 		}
 
 		
 		private ISymbol			 _instantiatedSymbol;
 		//private LinkedList		 _arguments;
-		private HashMap			 _argumentMap;
-		private Object			 _callbackExtension;
-		
+		private Map			 _argumentMap;
 	}
 	
 	public class Declaration extends BasicSymbol implements Cloneable, 
@@ -2568,11 +2639,11 @@
 			return _containedDeclarations;
 		}
 
-		public LinkedList getConstructors(){
+		public List getConstructors(){
 			return _constructors;
 		}
 		
-		public LinkedList createConstructors(){
+		public List createConstructors(){
 			if( _constructors == null )
 				_constructors = new LinkedList();
 			
@@ -2601,23 +2672,23 @@
 			_returnType = type;
 		}
 	
-		public LinkedList getParameterList(){
+		public List getParameterList(){
 			return _parameterList;
 		}
 		
-		public void setParameterList( LinkedList list ){
-			_parameterList = list;	
+		public void setParameterList( List list ){
+			_parameterList = new LinkedList( list );	
 		}
 		
-		public HashMap getParameterMap(){
+		public Map getParameterMap(){
 			return _parameterHash;
 		}
 		
-		public LinkedList getArgumentList(){
+		public List getArgumentList(){
 			return _argumentList;
 		}
-		public void setArgumentList( LinkedList list ){
-			_argumentList = list;
+		public void setArgumentList( List list ){
+			_argumentList = new LinkedList( list );
 		}
 		public void addArgument( ISymbol arg ){
 			if( _argumentList == null ){
@@ -2637,7 +2708,7 @@
 			
 			_parameterList.addLast( param );
 			String name = param.getName();
-			if( name != null && !name.equals("") )
+			if( name != null && !name.equals(EMPTY_NAME) )
 			{
 				if( _parameterHash == null )
 					_parameterHash = new HashMap();
@@ -2653,7 +2724,7 @@
 		}
 		
 		public void addParameter( ISymbol typeSymbol, TypeInfo.PtrOp ptrOp, boolean hasDefault ){
-			BasicSymbol param = new BasicSymbol("");
+			BasicSymbol param = new BasicSymbol(EMPTY_NAME);
 			
 			TypeInfo info = param.getTypeInfo();
 			info.setType( TypeInfo.t_type );
@@ -2665,7 +2736,7 @@
 		}
 	
 		public void addParameter( TypeInfo.eType type, int info, TypeInfo.PtrOp ptrOp, boolean hasDefault ){
-			BasicSymbol param = new BasicSymbol("");
+			BasicSymbol param = new BasicSymbol(EMPTY_NAME);
 					
 			TypeInfo t = param.getTypeInfo();
 			t.setTypeInfo( info );
@@ -2736,7 +2807,7 @@
 			
 			Map declarations = containing.getContainedSymbols();
 		
-			boolean unnamed = obj.getName().equals( "" );
+			boolean unnamed = obj.getName().equals( EMPTY_NAME );
 		
 			Object origObj = null;
 		
@@ -2800,9 +2871,7 @@
 			if( !constructor.isType( TypeInfo.t_constructor ) )
 				throw new ParserSymbolTableException( ParserSymbolTableException.r_BadTypeInfo );
 				
-			Object origObj = null;
-			
-			LinkedList constructors = getConstructors();
+			List constructors = getConstructors();
 			
 			if( constructors == null )
 				constructors = createConstructors();	
@@ -2820,6 +2889,20 @@
 			pushCommand( command );			
 		}
 		
+		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 ); 
+			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 );
+				addConstructor( constructor );	
+			}
+		}
 		/**
 		 * 
 		 * @param obj
@@ -2843,20 +2926,20 @@
 			if( obj.getContainingSymbol().isType( TypeInfo.t_class, TypeInfo.t_union ) ){
 				//check to see if there is already a this object, since using declarations
 				//of function will have them from the original declaration
-				LookupData data = new LookupData( "this", TypeInfo.t_any, null );
+				LookupData data = new LookupData( THIS, TypeInfo.t_any, null );
 				lookupInContained( data, obj );
 				//if we didn't find "this" then foundItems will still be null, no need to actually
 				//check its contents 
 				if( data.foundItems == null ){
-					Declaration thisObj = new Declaration("this");
+					Declaration thisObj = new Declaration( THIS );
 					thisObj.setType( TypeInfo.t_type );
 					thisObj.setTypeSymbol( obj.getContainingSymbol() );
 					//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().getFirst()).isConst() );
-						ptr.setVolatile( ((TypeInfo.PtrOp) obj.getPtrOperators().getFirst()).isVolatile() );
+						ptr.setConst( ((TypeInfo.PtrOp) obj.getPtrOperators().iterator().next()).isConst() );
+						ptr.setVolatile( ((TypeInfo.PtrOp) obj.getPtrOperators().iterator().next()).isVolatile() );
 					}
 					
 					thisObj.addPtrOperator(ptr);
@@ -3129,7 +3212,7 @@
 		 * Member lookup really proceeds as an unqualified lookup, but doesn't
 		 * include argument dependant scopes
 		 */
-		public IParameterizedSymbol memberFunctionLookup( String name, LinkedList parameters ) throws ParserSymbolTableException{
+		public IParameterizedSymbol memberFunctionLookup( String name, List parameters ) throws ParserSymbolTableException{
 			LookupData data = new LookupData( name, TypeInfo.t_function, getTemplateInstance() );
 			//if parameters == null, thats no parameters, but we need to distinguish that from
 			//no parameter information at all, so make an empty list.
@@ -3139,7 +3222,7 @@
 			return (IParameterizedSymbol) ParserSymbolTable.resolveAmbiguities( data ); 
 		}
 		
-		public IParameterizedSymbol qualifiedFunctionLookup( String name, LinkedList parameters ) throws ParserSymbolTableException{
+		public IParameterizedSymbol qualifiedFunctionLookup( String name, List parameters ) throws ParserSymbolTableException{
 			LookupData data = new LookupData( name, TypeInfo.t_function, getTemplateInstance() );
 			data.qualified = true;
 			//if parameters == null, thats no parameters, but we need to distinguish that from
@@ -3164,7 +3247,7 @@
 			return ParserSymbolTable.resolveAmbiguities( data ); 
 		}
 		
-		public TemplateInstance templateLookup( String name, LinkedList arguments ) throws ParserSymbolTableException
+		public TemplateInstance templateLookup( String name, List arguments ) throws ParserSymbolTableException
 		{
 			LookupData data = new LookupData( name, TypeInfo.t_any, getTemplateInstance() );
 			data.parameters = arguments;
@@ -3177,9 +3260,9 @@
 			return null;
 		}
 		
-		public IParameterizedSymbol lookupConstructor( LinkedList parameters ) throws ParserSymbolTableException
+		public IParameterizedSymbol lookupConstructor( List parameters ) throws ParserSymbolTableException
 		{
-			LookupData data = new LookupData( "", TypeInfo.t_constructor, null );
+			LookupData data = new LookupData( EMPTY_NAME, TypeInfo.t_constructor, null );
 			data.parameters = parameters;
 			
 			return ParserSymbolTable.resolveFunction( data, getConstructors() );
@@ -3207,7 +3290,7 @@
 		 * ordinary unqualified lookup and the set of declarations found in the
 		 * namespaces and classes associated with the argument types.
 		 */
-		public IParameterizedSymbol unqualifiedFunctionLookup( String name, LinkedList parameters ) throws ParserSymbolTableException{
+		public IParameterizedSymbol unqualifiedFunctionLookup( String name, List parameters ) throws ParserSymbolTableException{
 			//figure out the set of associated scopes first, so we can remove those that are searched
 			//during the normal lookup to avoid doing them twice
 			HashSet associated = new HashSet();
@@ -3231,7 +3314,7 @@
 				//if T is a pointer to a data member of class X, its associated namespaces and classes
 				//are those associated with the member type together with those associated with X
 				if( param.hasPtrOperators() && param.getPtrOperators().size() == 1 ){
-					TypeInfo.PtrOp op = (TypeInfo.PtrOp)param.getPtrOperators().getFirst();
+					TypeInfo.PtrOp op = (TypeInfo.PtrOp)param.getPtrOperators().iterator().next();
 					if( op.getType() == TypeInfo.PtrOp.t_pointer && 
 						paramType.getContainingSymbol().isType( TypeInfo.t_class, TypeInfo.t_union ) )
 					{
@@ -3258,8 +3341,6 @@
 				}
 									
 				Declaration decl;
-				Declaration temp;
-
 				//dump the hash to an array and iterate over the array because we
 				//could be removing items from the collection as we go and we don't
 				//want to get ConcurrentModificationExceptions			
@@ -3286,7 +3367,7 @@
 			return ( _specializations != null && !_specializations.isEmpty() );
 		}
 		
-		public LinkedList	getSpecializations(){
+		public List	getSpecializations(){
 			return _specializations;
 		}
 		
@@ -3297,7 +3378,7 @@
 			_specializations.add( spec );	
 		}
 
-		public TemplateInstance instantiate( LinkedList arguments ) throws ParserSymbolTableException{
+		public TemplateInstance instantiate( List arguments ) throws ParserSymbolTableException{
 			if( getType() != TypeInfo.t_template ){
 				return null;
 			}
@@ -3350,16 +3431,14 @@
 			return instance;
 		}
 		
-		
 		private		boolean		_needsDefinition;		//this name still needs to be defined
-		
 
-		private		LinkedList 	_parentScopes;			//inherited scopes (is base classes)
-		private		LinkedList 	_usingDirectives;		//collection of nominated namespaces
+		private		LinkedList	_parentScopes;			//inherited scopes (is base classes)
+		private		LinkedList	_usingDirectives;		//collection of nominated namespaces
 		private		HashMap 	_containedDeclarations;	//declarations contained by us.
 	
 		private		LinkedList	_specializations;		//template specializations
-		private		LinkedList	_argumentList;				//template specialization arguments
+		private		LinkedList	_argumentList;			//template specialization arguments
 		
 		private 	LinkedList	_parameterList;			//have my cake
 		private 	HashMap		_parameterHash;			//and eat it too
@@ -3368,8 +3447,6 @@
 		
 		private 	ISymbol		_returnType;			
 	
-		
-		
 		public class ParentWrapper implements IDerivableContainerSymbol.IParentSymbol
 		{
 			public ParentWrapper( ISymbol p, boolean v, ASTAccessVisibility s, int offset, List r ){
@@ -3394,6 +3471,10 @@
 			
 			public void setVirtual( boolean virtual ){
 				isVirtual = virtual;
+			}
+			
+			public ASTAccessVisibility  getVisibility(){
+				return access;
 			}
 			
 			private boolean isVirtual = false;
Index: parser/org/eclipse/cdt/internal/core/parser/pst/ParserSymbolTableException.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/pst/ParserSymbolTableException.java,v
retrieving revision 1.3
diff -u -r1.3 ParserSymbolTableException.java
--- parser/org/eclipse/cdt/internal/core/parser/pst/ParserSymbolTableException.java	7 Aug 2003 14:46:58 -0000	1.3
+++ parser/org/eclipse/cdt/internal/core/parser/pst/ParserSymbolTableException.java	18 Sep 2003 18:47:07 -0000
@@ -43,6 +43,7 @@
 	public static final int r_InvalidOverload		=  3;
 	public static final int r_BadTemplate			=  4;
 	public static final int r_InvalidUsing			=  5;
+	public static final int r_BadVisibility			=  6;
 	
 	public int reason = -1;
 }
Index: parser/org/eclipse/cdt/internal/core/parser/pst/TypeInfo.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/pst/TypeInfo.java,v
retrieving revision 1.4
diff -u -r1.4 TypeInfo.java
--- parser/org/eclipse/cdt/internal/core/parser/pst/TypeInfo.java	14 Aug 2003 19:49:44 -0000	1.4
+++ parser/org/eclipse/cdt/internal/core/parser/pst/TypeInfo.java	18 Sep 2003 18:47:07 -0000
@@ -13,7 +13,9 @@
 import java.util.Iterator;
 import java.util.LinkedList;
 import java.util.List;
+import java.util.ListIterator;
 
+import org.eclipse.cdt.core.parser.Enum;
 import org.eclipse.cdt.internal.core.parser.pst.ParserSymbolTable.TemplateInstance;
 
 
@@ -130,6 +132,26 @@
 		private int _val;
 	}
 	
+	public static class OperatorExpression extends Enum{
+		
+		//5.3.1-1 : The unary * operator, the expression to which it is applied shall be
+		//a pointer to an object type or a pointer to a function type and the result
+		//is an lvalue refering to the object or function to which the expression points
+		public static final OperatorExpression indirection = new OperatorExpression( 1 );
+		
+		//5.3.1-2 : The result of the unary & operator is a pointer to its operand
+		public static final OperatorExpression addressof = new OperatorExpression( 0 );
+		
+		//5.2.1 A postfix expression followed by an expression in square brackets is a postfix
+		//expression.  one of the expressions shall have the type "pointer to T" and the other
+		//shall have a enumeration or integral type.  The result is an lvalue of type "T"
+		public static final OperatorExpression subscript = new OperatorExpression( 2 );
+		
+		protected OperatorExpression(int enumValue) {
+			super(enumValue);
+		}
+	}
+	
 	public static class PtrOp {
 		public PtrOp( TypeInfo.eType type ){
 			this.type = type;
@@ -190,23 +212,27 @@
 		private ISymbol memberOf = null;
 	}
 
-	private static final String _image[] = {	"", 
-												"", 
-												"namespace", 
-												"template",
-												"class", 
-												"struct", 
-												"union", 
-												"enum",
-												"",
-												"bool",
-												"char",
-												"wchar_t",
-												"int",
-												"float",
-												"double",
-												"void",
-												""
+	private static final String _image[] = {	"", 		//$NON-NLS-1$	t_undef
+												"", 		//$NON-NLS-1$	t_type
+												"namespace", //$NON-NLS-1$	t_namespace
+												"class", 	//$NON-NLS-1$	t_class
+												"struct", 	//$NON-NLS-1$	t_struct
+												"union", 	//$NON-NLS-1$	t_union
+												"enum",		//$NON-NLS-1$	t_enumeration
+												"",			//$NON-NLS-1$	t_constructor
+												"",			//$NON-NLS-1$	t_function
+												"bool",		//$NON-NLS-1$	t_bool
+												"char",		//$NON-NLS-1$	t_char
+												"wchar_t",	//$NON-NLS-1$	t_wchar_t
+												"int",		//$NON-NLS-1$	t_int
+												"float",	//$NON-NLS-1$	t_float
+												"double",	//$NON-NLS-1$	t_double
+												"void",		//$NON-NLS-1$	t_void
+												"",			//$NON-NLS-1$	t_enumerator
+												"",			//$NON-NLS-1$	t_block	
+												"template",	//$NON-NLS-1$	t_template
+												"",			//$NON-NLS-1$	t_asm			
+												""			//$NON-NLS-1$	t_linkage
 											 };
 	//Partial ordering :
 	// none		< const
@@ -286,7 +312,7 @@
 		return ( _ptrOperators != null && _ptrOperators.size() > 0 );	
 	}
 	
-	public LinkedList getPtrOperators(){
+	public List getPtrOperators(){
 		return _ptrOperators;
 	}
 	
@@ -311,40 +337,38 @@
 		return false;
 	}
 
-	public void applyPtrsAsUnaryOperators( LinkedList ptrs ){
-		if( ptrs == null || ptrs.isEmpty() )
+	public List getOperatorExpressions(){
+		return _operatorExpressions;
+	}
+	
+
+	public void applyOperatorExpressions( List ops ){
+		if( ops == null || ops.isEmpty() )
 			return;
 			
-		int size = ptrs.size();
-		Iterator iter = ptrs.iterator();
-		TypeInfo.PtrOp op = null;
+		int size = ops.size();
+		Iterator iter = ops.iterator();
+		OperatorExpression op = null;
 		for( int i = size; i > 0; i-- ){
-			op = (TypeInfo.PtrOp)iter.next();
-			if( op.getType() == PtrOp.t_pointer  ){
+			op = (OperatorExpression)iter.next();
+			if( op == OperatorExpression.indirection ||
+				op == OperatorExpression.subscript )
+			{
 				//indirection operator, can only be applied to a pointer
+				//subscript should be applied to something that is "pointer to T", the result is a lvalue of type "T"
 				if( hasPtrOperators() ){
-					TypeInfo.PtrOp first = (TypeInfo.PtrOp)getPtrOperators().getFirst();
-					if( first.getType() == TypeInfo.PtrOp.t_pointer )
+					ListIterator iterator = getPtrOperators().listIterator( getPtrOperators().size() );
+					TypeInfo.PtrOp last = (TypeInfo.PtrOp)iterator.previous();
+					if( last.getType() == TypeInfo.PtrOp.t_pointer ||
+						last.getType() == TypeInfo.PtrOp.t_array  )
 					{
-						getPtrOperators().removeFirst();
-						if( op.isConst() || op.isVolatile() ){
-							
-							if( hasPtrOperators() ){
-								((TypeInfo.PtrOp)getPtrOperators().getFirst()).setConst( op.isConst() );
-								((TypeInfo.PtrOp)getPtrOperators().getFirst()).setVolatile( op.isVolatile() );
-							} else {
-								TypeInfo.PtrOp newOp = new TypeInfo.PtrOp( TypeInfo.PtrOp.t_undef, op.isConst(), op.isVolatile() );
-								addPtrOperator( newOp );
-							}
-						}
+						iterator.remove();
 					}
-				} else {
-					//???
 				}
-			} else if( op.getType() == PtrOp.t_reference ){
+			} else if( op == OperatorExpression.addressof ){
 				//Address-of unary operator, results in pointer to T
 				//TODO or pointer to member
-				TypeInfo.PtrOp newOp = new TypeInfo.PtrOp( PtrOp.t_pointer , op.isConst(), op.isVolatile() );
+				TypeInfo.PtrOp newOp = new TypeInfo.PtrOp( PtrOp.t_pointer );
 				addPtrOperator( newOp );
 			}
 		}
@@ -366,6 +390,13 @@
 			_ptrOperators.addAll( ptrs );
 	}
 	
+	public void addOperatorExpression( OperatorExpression exp ){
+		if( _operatorExpressions == null ){
+			_operatorExpressions = new LinkedList();
+		}
+		_operatorExpressions.add( exp );
+	}
+	
 	public boolean getHasDefault(){
 		return _hasDefaultValue;
 	}
@@ -414,10 +445,18 @@
 		if( _typeDeclaration instanceof TemplateInstance ){
 			result &= _typeDeclaration.equals( type._typeDeclaration );
 		} else {
-			result &= ( _typeDeclaration == type._typeDeclaration );
+			if( _typeDeclaration != null && type._typeDeclaration != null   &&
+				_typeDeclaration.isType( TypeInfo.t_bool, TypeInfo.t_void ) &&
+				type._typeDeclaration.isType( TypeInfo.t_bool, TypeInfo.t_void ) )
+			{
+				//if typeDeclaration is a basic type, then only need the types the same
+				result &= ( _typeDeclaration.getType() == type._typeDeclaration.getType() );		
+			} else {
+				//otherwise, its a user defined type, need the decls the same
+				result &= ( _typeDeclaration == type._typeDeclaration );
+			}
 		}
-		
-	
+			
 		int size1 = (_ptrOperators == null) ? 0 : _ptrOperators.size();
 		int size2 = (type._ptrOperators == null) ? 0 : type._ptrOperators.size();
 		if( size1 == size2 ){
@@ -457,4 +496,5 @@
 	private boolean	_hasDefaultValue = false;
 	private Object _defaultValue = null;
 	private LinkedList _ptrOperators;	
+	private LinkedList _operatorExpressions;
 }
Index: ChangeLog
===================================================================
RCS file: /home/tools/org.eclipse.cdt.core.tests/ChangeLog,v
retrieving revision 1.102
diff -u -r1.102 ChangeLog
--- ChangeLog	18 Sep 2003 15:22:42 -0000	1.102
+++ ChangeLog	18 Sep 2003 18:54:28 -0000
@@ -1,3 +1,13 @@
+2003-09-18 Andrew Niefer
+	- removed testConditionalExpression_Bug43159 from FailedCompleteParseASTExpressionTest
+	  and uncommented it (testConditionalExpression) in CompleteParseASTExpressionTest
+	- uncommented the following tests in CompleteParseASTExpressionTest :
+	    testPostfixSubscript, testPostfixSubscriptA, testPostfixSubscriptB,
+	    testPostfixSubscriptWithReferences
+	- updated ParserSymbolTableTests to use new addOperatorExpression function
+	- added testDerivedReference, testAddCopyConstructor to ParserSymbolTableTests
+	- fixed warning in ClassDeclarationPatternTests
+
 2003-09-17 Hoda Amer
 	Added more success test cases to CompleteParseASTExpressionTest
 	and more failure test cases to FailedCompleteParseASTExpressionTest
Index: failures/org/eclipse/cdt/core/parser/failedTests/FailedCompleteParseASTExpressionTest.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.core.tests/failures/org/eclipse/cdt/core/parser/failedTests/FailedCompleteParseASTExpressionTest.java,v
retrieving revision 1.4
diff -u -r1.4 FailedCompleteParseASTExpressionTest.java
--- failures/org/eclipse/cdt/core/parser/failedTests/FailedCompleteParseASTExpressionTest.java	18 Sep 2003 15:22:42 -0000	1.4
+++ failures/org/eclipse/cdt/core/parser/failedTests/FailedCompleteParseASTExpressionTest.java	18 Sep 2003 18:54:28 -0000
@@ -79,23 +79,23 @@
 //		assertEquals( ((IASTReference)references.next()).getReferencedElement(), pa );
 //		assertEquals( ((IASTReference)references.next()).getReferencedElement(), f1 );
 //	}	
-	public void testConditionalExpression_Bug43159() throws Exception { 
-		Iterator i = parse( "int foo(bool); int foo(int); int a = 10, b = 4, c = 2; int x = foo( a > 5 ? b : c );").getDeclarations();
-		IASTFunction foo1 = (IASTFunction)i.next();
-		IASTFunction foo2 = (IASTFunction)i.next(); 
-		IASTVariable a = (IASTVariable)i.next();
-		IASTVariable b = (IASTVariable)i.next();
-		IASTVariable c = (IASTVariable)i.next();
-		IASTVariable x = (IASTVariable)i.next();
-		assertFalse( i.hasNext() );
-		assertEquals( callback.getReferences().size(), 3 ); // should be 4
-		Iterator references =callback.getReferences().iterator();
-		assertEquals( ((IASTReference)references.next()).getReferencedElement(), a ); 
-		assertEquals( ((IASTReference)references.next()).getReferencedElement(), b ); 
-		assertEquals( ((IASTReference)references.next()).getReferencedElement(), c ); 
-		//assertEquals( ((IASTReference)references.next()).getReferencedElement(), foo2 ); 
-		assertFalse( references.hasNext() );	
-	}
+//	public void testConditionalExpression_Bug43159() throws Exception { 
+//		Iterator i = parse( "int foo(bool); int foo(int); int a = 10, b = 4, c = 2; int x = foo( a > 5 ? b : c );").getDeclarations();
+//		IASTFunction foo1 = (IASTFunction)i.next();
+//		IASTFunction foo2 = (IASTFunction)i.next(); 
+//		IASTVariable a = (IASTVariable)i.next();
+//		IASTVariable b = (IASTVariable)i.next();
+//		IASTVariable c = (IASTVariable)i.next();
+//		IASTVariable x = (IASTVariable)i.next();
+//		assertFalse( i.hasNext() );
+//		assertEquals( callback.getReferences().size(), 3 ); // should be 4
+//		Iterator references =callback.getReferences().iterator();
+//		assertEquals( ((IASTReference)references.next()).getReferencedElement(), a ); 
+//		assertEquals( ((IASTReference)references.next()).getReferencedElement(), b ); 
+//		assertEquals( ((IASTReference)references.next()).getReferencedElement(), c ); 
+//		//assertEquals( ((IASTReference)references.next()).getReferencedElement(), foo2 ); 
+//		assertFalse( references.hasNext() );	
+//	}
 	
 	public void testConditionalExpressionWithReferencesB_Bug43106() throws Exception { 
 		Iterator i = parse( "class A{}; class B : public A{}; int foo(); int foo(A&); A a ; B b; int c = 0; int x = foo( c > 5 ? b : a );").getDeclarations();
Index: parser/org/eclipse/cdt/core/parser/tests/CompleteParseASTExpressionTest.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/CompleteParseASTExpressionTest.java,v
retrieving revision 1.5
diff -u -r1.5 CompleteParseASTExpressionTest.java
--- parser/org/eclipse/cdt/core/parser/tests/CompleteParseASTExpressionTest.java	18 Sep 2003 15:22:42 -0000	1.5
+++ parser/org/eclipse/cdt/core/parser/tests/CompleteParseASTExpressionTest.java	18 Sep 2003 18:54:29 -0000
@@ -170,59 +170,59 @@
 		assertEquals( fr1.getReferencedElement(), f1 );
 	}
 	// Kind POSTFIX_SUBSCRIPT	
-//	public void testPostfixSubscript() throws Exception
-//	{
-//		Iterator i = parse ("int pa[10]; \n int f(int ia){} \n int f(void); \n int x = f(pa[1]);").getDeclarations();
-//		IASTVariable pa  = (IASTVariable) i.next();
-//		IASTFunction f1 = (IASTFunction) i.next();
-//		IASTFunction f2 = (IASTFunction) i.next();
-//		IASTVariable x  = (IASTVariable) i.next();
-//		Iterator references = callback.getReferences().iterator();
-//		assertEquals( callback.getReferences().size(), 2 );
-//		assertEquals( ((IASTReference)references.next()).getReferencedElement(), pa );
-//		assertEquals( ((IASTReference)references.next()).getReferencedElement(), f1 );
-//	}
-//		
-// 	public void testPostfixSubscriptA() throws Exception
-//	{
-//		Iterator i = parse ("int pa[10][5] ; \n int f(int ia){} \n int f(void); \n int x = f(pa[1][2]);").getDeclarations();
-//		IASTVariable pa  = (IASTVariable) i.next();
-//		IASTFunction f1 = (IASTFunction) i.next();
-//		IASTFunction f2 = (IASTFunction) i.next();
-//		IASTVariable x  = (IASTVariable) i.next();
-//		Iterator references = callback.getReferences().iterator();
-//		assertEquals( callback.getReferences().size(), 2 ); // should be = 2
-//		assertEquals( ((IASTReference)references.next()).getReferencedElement(), pa );
-//		assertEquals( ((IASTReference)references.next()).getReferencedElement(), f1 );
-//	}	 
-//  
-// 	public void testPostfixSubscriptB() throws Exception
-//	{
-//		Iterator i = parse ("int* pa[10][5] ; \n int f(int* ia){} \n int f(void); \n int x = f(pa[1][2]);").getDeclarations();
-//		IASTVariable pa  = (IASTVariable) i.next();
-//		IASTFunction f1 = (IASTFunction) i.next();
-//		IASTFunction f2 = (IASTFunction) i.next();
-//		IASTVariable x  = (IASTVariable) i.next();
-//		Iterator references = callback.getReferences().iterator();
-//		assertEquals( callback.getReferences().size(), 2 ); // should be = 2
-//		assertEquals( ((IASTReference)references.next()).getReferencedElement(), pa );
-//		assertEquals( ((IASTReference)references.next()).getReferencedElement(), f1 );
-//	}	
-//	
-//	public void testPostfixSubscriptWithReferences() throws Exception
-//	{
-//		Iterator i = parse ("class A{}; \n A *pa[10][5] ; \n int f(A* ia){} \n int f(void); \n int x = f(pa[1][2]);").getDeclarations();
-//		IASTClassSpecifier cl = (IASTClassSpecifier)((IASTAbstractTypeSpecifierDeclaration)i.next()).getTypeSpecifier();
-//		IASTVariable pa  = (IASTVariable) i.next();
-//		IASTFunction f1 = (IASTFunction) i.next();
-//		IASTFunction f2 = (IASTFunction) i.next();
-//		IASTVariable x  = (IASTVariable) i.next();
-//		Iterator references = callback.getReferences().iterator();
-//		assertEquals( ((IASTClassReference) references.next()).getReferencedElement(), cl );
-//		assertEquals( ((IASTClassReference) references.next()).getReferencedElement(), cl );
-//		assertEquals( ((IASTReference)references.next()).getReferencedElement(), pa );
-//		assertEquals( ((IASTReference)references.next()).getReferencedElement(), f1 );
-//	}
+	public void testPostfixSubscript() throws Exception
+	{
+		Iterator i = parse ("int pa[10]; \n int f(int ia){} \n int f(void); \n int x = f(pa[1]);").getDeclarations();
+		IASTVariable pa  = (IASTVariable) i.next();
+		IASTFunction f1 = (IASTFunction) i.next();
+		IASTFunction f2 = (IASTFunction) i.next();
+		IASTVariable x  = (IASTVariable) i.next();
+		Iterator references = callback.getReferences().iterator();
+		assertEquals( callback.getReferences().size(), 2 );
+		assertEquals( ((IASTReference)references.next()).getReferencedElement(), pa );
+		assertEquals( ((IASTReference)references.next()).getReferencedElement(), f1 );
+	}
+		
+ 	public void testPostfixSubscriptA() throws Exception
+	{
+		Iterator i = parse ("int pa[10][5] ; \n int f(int ia){} \n int f(void); \n int x = f(pa[1][2]);").getDeclarations();
+		IASTVariable pa  = (IASTVariable) i.next();
+		IASTFunction f1 = (IASTFunction) i.next();
+		IASTFunction f2 = (IASTFunction) i.next();
+		IASTVariable x  = (IASTVariable) i.next();
+		Iterator references = callback.getReferences().iterator();
+		assertEquals( callback.getReferences().size(), 2 ); // should be = 2
+		assertEquals( ((IASTReference)references.next()).getReferencedElement(), pa );
+		assertEquals( ((IASTReference)references.next()).getReferencedElement(), f1 );
+	}	 
+  
+ 	public void testPostfixSubscriptB() throws Exception
+	{
+		Iterator i = parse ("int* pa[10][5] ; \n int f(int* ia){} \n int f(void); \n int x = f(pa[1][2]);").getDeclarations();
+		IASTVariable pa  = (IASTVariable) i.next();
+		IASTFunction f1 = (IASTFunction) i.next();
+		IASTFunction f2 = (IASTFunction) i.next();
+		IASTVariable x  = (IASTVariable) i.next();
+		Iterator references = callback.getReferences().iterator();
+		assertEquals( callback.getReferences().size(), 2 ); // should be = 2
+		assertEquals( ((IASTReference)references.next()).getReferencedElement(), pa );
+		assertEquals( ((IASTReference)references.next()).getReferencedElement(), f1 );
+	}	
+	
+	public void testPostfixSubscriptWithReferences() throws Exception
+	{
+		Iterator i = parse ("class A{}; \n A *pa[10][5] ; \n int f(A* ia){} \n int f(void); \n int x = f(pa[1][2]);").getDeclarations();
+		IASTClassSpecifier cl = (IASTClassSpecifier)((IASTAbstractTypeSpecifierDeclaration)i.next()).getTypeSpecifier();
+		IASTVariable pa  = (IASTVariable) i.next();
+		IASTFunction f1 = (IASTFunction) i.next();
+		IASTFunction f2 = (IASTFunction) i.next();
+		IASTVariable x  = (IASTVariable) i.next();
+		Iterator references = callback.getReferences().iterator();
+		assertEquals( ((IASTClassReference) references.next()).getReferencedElement(), cl );
+		assertEquals( ((IASTClassReference) references.next()).getReferencedElement(), cl );
+		assertEquals( ((IASTReference)references.next()).getReferencedElement(), pa );
+		assertEquals( ((IASTReference)references.next()).getReferencedElement(), f1 );
+	}
 	
 	// Kind POSTFIX_FUNCTIONCALL : return type of called function
 	public void testPostfixFunctioncallBug42822() throws Exception
@@ -891,23 +891,23 @@
 		assertFalse( references.hasNext() );	
 	}
 	// Kind CONDITIONALEXPRESSION : conditional Expression Conversions     
-//	public void testConditionalExpression() throws Exception { 
-//		Iterator i = parse( "int foo(bool); int foo(int); int a = 10, b = 4, c = 2; int x = foo( a > 5 ? b : c );").getDeclarations();
-//		IASTFunction foo1 = (IASTFunction)i.next();
-//		IASTFunction foo2 = (IASTFunction)i.next(); 
-//		IASTVariable a = (IASTVariable)i.next();
-//		IASTVariable b = (IASTVariable)i.next();
-//		IASTVariable c = (IASTVariable)i.next();
-//		IASTVariable x = (IASTVariable)i.next();
-//		assertFalse( i.hasNext() );
-//		assertEquals( callback.getReferences().size(), 4 );
-//		Iterator references =callback.getReferences().iterator();
-//		assertEquals( ((IASTReference)references.next()).getReferencedElement(), a ); 
-//		assertEquals( ((IASTReference)references.next()).getReferencedElement(), b ); 
-//		assertEquals( ((IASTReference)references.next()).getReferencedElement(), c ); 
-//		assertEquals( ((IASTReference)references.next()).getReferencedElement(), foo2 ); 
-//		assertFalse( references.hasNext() );	
-//	}
+	public void testConditionalExpression() throws Exception { 
+		Iterator i = parse( "int foo(bool); int foo(int); int a = 10, b = 4, c = 2; int x = foo( a > 5 ? b : c );").getDeclarations();
+		IASTFunction foo1 = (IASTFunction)i.next();
+		IASTFunction foo2 = (IASTFunction)i.next(); 
+		IASTVariable a = (IASTVariable)i.next();
+		IASTVariable b = (IASTVariable)i.next();
+		IASTVariable c = (IASTVariable)i.next();
+		IASTVariable x = (IASTVariable)i.next();
+		assertFalse( i.hasNext() );
+		assertEquals( callback.getReferences().size(), 4 );
+		Iterator references =callback.getReferences().iterator();
+		assertEquals( ((IASTReference)references.next()).getReferencedElement(), a ); 
+		assertEquals( ((IASTReference)references.next()).getReferencedElement(), b ); 
+		assertEquals( ((IASTReference)references.next()).getReferencedElement(), c ); 
+		assertEquals( ((IASTReference)references.next()).getReferencedElement(), foo2 ); 
+		assertFalse( references.hasNext() );	
+	}
 	// Kind CONDITIONALEXPRESSION with references : conditional Expression Conversions      
 	public void testConditionalExpressionWithReferencesA() throws Exception { 
 		Iterator i = parse( "class A{}; class B : public A{}; int foo(); int foo(A*); A *a ; B *b; int c = 0; int x = foo( c > 5 ? b : a );").getDeclarations();
Index: parser/org/eclipse/cdt/core/parser/tests/ParserSymbolTableTest.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ParserSymbolTableTest.java,v
retrieving revision 1.19
diff -u -r1.19 ParserSymbolTableTest.java
--- parser/org/eclipse/cdt/core/parser/tests/ParserSymbolTableTest.java	15 Sep 2003 22:50:59 -0000	1.19
+++ parser/org/eclipse/cdt/core/parser/tests/ParserSymbolTableTest.java	18 Sep 2003 18:54:30 -0000
@@ -30,6 +30,7 @@
 import org.eclipse.cdt.internal.core.parser.pst.TypeInfo;
 import org.eclipse.cdt.internal.core.parser.pst.ParserSymbolTable.Mark;
 import org.eclipse.cdt.internal.core.parser.pst.ParserSymbolTable.TemplateInstance;
+import org.eclipse.cdt.internal.core.parser.pst.TypeInfo.OperatorExpression;
 import org.eclipse.cdt.internal.core.parser.pst.TypeInfo.PtrOp;
 
 
@@ -1187,8 +1188,8 @@
 		
 		assertEquals( look.getType(), TypeInfo.t_type );
 		assertEquals( look.getTypeSymbol(), cls );
-		assertEquals( ((PtrOp)look.getPtrOperators().getFirst()).getType(), TypeInfo.PtrOp.t_pointer );
-		assertTrue( ((PtrOp)look.getPtrOperators().getFirst()).isConst() );
+		assertEquals( ((PtrOp)look.getPtrOperators().iterator().next()).getType(), TypeInfo.PtrOp.t_pointer );
+		assertTrue( ((PtrOp)look.getPtrOperators().iterator().next()).isConst() );
 		assertEquals( look.getContainingSymbol(), fn );
 	}
 	
@@ -1364,7 +1365,9 @@
 		LinkedList paramList = new LinkedList();
 		look = compUnit.lookup( "a" );
 		assertEquals( look, a );
-		TypeInfo param = new TypeInfo( look.getType(), 0, look, new PtrOp( PtrOp.t_reference ), false );
+		TypeInfo param = new TypeInfo( look.getType(), 0, look, null, false );
+		//new PtrOp( PtrOp.t_reference )
+		param.addOperatorExpression( OperatorExpression.addressof );
 		paramList.add( param );
 		
 		look = compUnit.unqualifiedFunctionLookup( "f", paramList );
@@ -1640,21 +1643,21 @@
 		ISymbol look = compUnit.unqualifiedFunctionLookup( "f", paramList );
 		assertEquals( look, f2 );
 		
-		p.addPtrOperator( new PtrOp( PtrOp.t_reference, false, false ) );
+		p.addOperatorExpression( OperatorExpression.addressof );
 		look = compUnit.unqualifiedFunctionLookup( "f", paramList );
 		assertEquals( look, f1 );
 		
 		p.setTypeSymbol( b );
-		p.getPtrOperators().clear();
+		p.getOperatorExpressions().clear();
 		look = compUnit.unqualifiedFunctionLookup( "f", paramList );
 		assertEquals( look, f1 );
 		
-		p.addPtrOperator( new PtrOp( PtrOp.t_pointer, false, false ) );
+		p.addOperatorExpression( OperatorExpression.indirection );
 		look = compUnit.unqualifiedFunctionLookup( "f", paramList );
 		assertEquals( look, f2 );
 		
 		p.setTypeSymbol( array );
-		p.getPtrOperators().clear();
+		p.getOperatorExpressions().clear();
 		look = compUnit.unqualifiedFunctionLookup( "f", paramList );
 		assertEquals( look, f1 );
 		
@@ -1765,7 +1768,8 @@
 		compUnit.addSymbol( main );
 		
 		LinkedList params = new LinkedList();
-		TypeInfo p1 = new TypeInfo( TypeInfo.t_type, 0, i, new PtrOp( PtrOp.t_reference ), false );
+		TypeInfo p1 = new TypeInfo( TypeInfo.t_type, 0, i );
+		p1.addOperatorExpression( OperatorExpression.addressof );
 		TypeInfo p2 = new TypeInfo( TypeInfo.t_type, 0, s );
 		params.add( p1 );
 		params.add( p2 );
@@ -1794,7 +1798,8 @@
 		assertEquals( look, f2 );
 		
 		params.clear();
-		((PtrOp)p1.getPtrOperators().getFirst()).setConst( true );
+		p1.addPtrOperator( new PtrOp( PtrOp.t_undef, true, false ) );
+		//((PtrOp)p1.getPtrOperators().iterator().next()).setConst( true );
 		params.add( p1 );
 		params.add( p3 );
 		look = main.unqualifiedFunctionLookup( "f", params );
@@ -2660,8 +2665,10 @@
 		table.getCompilationUnit().addSymbol( a );
 		table.getCompilationUnit().addSymbol( b );
 		
-		TypeInfo secondOp = new TypeInfo( TypeInfo.t_type, 0, a, new PtrOp( PtrOp.t_reference ), false );
-		TypeInfo thirdOp = new TypeInfo( TypeInfo.t_type, 0, b, new PtrOp( PtrOp.t_reference ), false );
+		TypeInfo secondOp = new TypeInfo( TypeInfo.t_type, 0, a );
+		secondOp.addOperatorExpression( OperatorExpression.addressof );
+		TypeInfo thirdOp = new TypeInfo( TypeInfo.t_type, 0, b );
+		thirdOp.addOperatorExpression( OperatorExpression.addressof );
 		
 		TypeInfo returned = ParserSymbolTable.getConditionalOperand( secondOp, thirdOp );
 		assertEquals( returned, secondOp );
@@ -2672,7 +2679,8 @@
 		c.setTypeSymbol( clsC );
 		table.getCompilationUnit().addSymbol( c );
 		
-		TypeInfo anotherOp = new TypeInfo( TypeInfo.t_type, 0, c, new PtrOp( PtrOp.t_reference ), false );
+		TypeInfo anotherOp = new TypeInfo( TypeInfo.t_type, 0, c );
+		anotherOp.addOperatorExpression( OperatorExpression.addressof );
 		
 		returned = ParserSymbolTable.getConditionalOperand( secondOp, anotherOp );
 		assertEquals( returned, null );
@@ -2685,8 +2693,8 @@
 		constructorC.addParameter( clsA, null, false );
 		clsC.addConstructor( constructorC );
 		
-		secondOp.getPtrOperators().clear();
-		anotherOp.getPtrOperators().clear();
+		secondOp.getOperatorExpressions().clear();
+		anotherOp.getOperatorExpressions().clear();
 		try{
 			
 			returned = ParserSymbolTable.getConditionalOperand( secondOp, anotherOp );
@@ -2696,5 +2704,123 @@
 		}
 	}
 	
+	/**
+	 * 
+	 * @throws Exception
+	 * class A {};
+	 * class B : public A {} b;
+	 * class C : private A {} c;
+	 * int f ( A & );
+	 * 
+	 * int i = f ( b );  //calls f( A & );
+	 * 
+	 * int f ( B & );
+	 * i = f( b );   	//now calls f( B& );
+	 * 
+	 * i = f( c );	//exception, A is not an accessible base class
+	 */
+	public void testDerivedReference() throws Exception{
+		newTable();
+		
+		IDerivableContainerSymbol clsA = table.newDerivableContainerSymbol( "A", TypeInfo.t_class );
+		IDerivableContainerSymbol clsB = table.newDerivableContainerSymbol( "B", TypeInfo.t_class );
+		IDerivableContainerSymbol clsC = table.newDerivableContainerSymbol( "C", TypeInfo.t_class );
+		
+		clsB.addParent( clsA );
+		clsC.addParent( clsA, false, ASTAccessVisibility.PRIVATE, 0, null );
+		
+		ISymbol b = table.newSymbol("b", TypeInfo.t_type );
+		b.setTypeSymbol( clsB );
+		
+		ISymbol c = table.newSymbol("c", TypeInfo.t_type );
+		c.setTypeSymbol( clsC );
+		
+		table.getCompilationUnit().addSymbol( clsA );
+		table.getCompilationUnit().addSymbol( clsB );
+		table.getCompilationUnit().addSymbol( clsC );
+		table.getCompilationUnit().addSymbol( b );
+		table.getCompilationUnit().addSymbol( c );
+		
+		IParameterizedSymbol f1 = table.newParameterizedSymbol( "f", TypeInfo.t_function );
+		f1.addParameter( clsA, new PtrOp( PtrOp.t_reference ), false );
+		table.getCompilationUnit().addSymbol( f1 );
+		
+		LinkedList parameters = new LinkedList();
+		TypeInfo param = new TypeInfo( TypeInfo.t_type, 0, b );
+		parameters.add( param );
+		
+		ISymbol look = table.getCompilationUnit().unqualifiedFunctionLookup( "f", parameters );
+		assertEquals( look, f1 );
+		
+		IParameterizedSymbol f2 = table.newParameterizedSymbol( "f", TypeInfo.t_function );
+		f2.addParameter( clsB, new PtrOp( PtrOp.t_reference ), false );
+		table.getCompilationUnit().addSymbol( f2 );
+		
+		look = table.getCompilationUnit().unqualifiedFunctionLookup( "f", parameters );
+		assertEquals( look, f2 );
+		
+		parameters.clear();
+		param = new TypeInfo( TypeInfo.t_type, 0, c );
+		parameters.add( param );
+		try{
+			look = table.getCompilationUnit().unqualifiedFunctionLookup( "f", parameters );
+			assertTrue( false );
+		} catch ( ParserSymbolTableException e ){
+			//good
+		}
+	}
+	
+	/**
+	 * 
+	 * @throws Exception
+	 * 
+	 * class A {
+	 * private : 
+	 *    A ( const A & ) {}
+	 * } a;
+	 * 
+	 * class B : public A {
+	 * } b;
+	 * 
+	 * 1 > 2 ? a : b;	//fails, b can't be converted to a without the A( const A & ) copy constructor
+	 * -----------------------
+	 * class A {
+	 *    A ( const A & ) {}
+	 * } a;
+	 * class B : public A {} b;
+	 * 
+	 * 1 > 2 ? a : b;  //succeeds, b can be converted to a using copy constructor
+	 * 
+	 */
+	public void testAddCopyConstructor() throws Exception {
+		newTable();
+		
+		IDerivableContainerSymbol clsA = table.newDerivableContainerSymbol( "A", TypeInfo.t_class );
+		table.getCompilationUnit().addSymbol( clsA );
+		
+		ISymbol a = table.newSymbol( "a", TypeInfo.t_type );
+		a.setTypeSymbol( clsA );
+		table.getCompilationUnit().addSymbol( a );
+		
+		IDerivableContainerSymbol clsB = table.newDerivableContainerSymbol( "B", TypeInfo.t_class );
+		clsB.addParent( clsA );
+		table.getCompilationUnit().addSymbol( clsB );
+		
+		ISymbol b = table.newSymbol( "b", TypeInfo.t_type );
+		b.setTypeSymbol( clsB );
+		table.getCompilationUnit().addSymbol( b );
+		
+		TypeInfo secondOp = new TypeInfo( TypeInfo.t_type, 0, a, null, false );
+		TypeInfo thirdOp = new TypeInfo( TypeInfo.t_type, 0, b, null, false );
+		
+		TypeInfo returned = ParserSymbolTable.getConditionalOperand( secondOp, thirdOp );
+		assertEquals( returned, null );
+		
+		clsA.addCopyConstructor();
+		clsB.addCopyConstructor();
+		
+		returned = ParserSymbolTable.getConditionalOperand( secondOp, thirdOp );
+		assertEquals( returned, secondOp );	
+	}
 }
 
Index: search/org/eclipse/cdt/core/search/tests/ClassDeclarationPatternTests.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.core.tests/search/org/eclipse/cdt/core/search/tests/ClassDeclarationPatternTests.java,v
retrieving revision 1.15
diff -u -r1.15 ClassDeclarationPatternTests.java
--- search/org/eclipse/cdt/core/search/tests/ClassDeclarationPatternTests.java	15 Sep 2003 17:31:17 -0000	1.15
+++ search/org/eclipse/cdt/core/search/tests/ClassDeclarationPatternTests.java	18 Sep 2003 18:54:30 -0000
@@ -22,7 +22,6 @@
 import org.eclipse.cdt.core.search.SearchEngine;
 import org.eclipse.cdt.internal.core.CharOperation;
 import org.eclipse.cdt.internal.core.search.matching.ClassDeclarationPattern;
-import org.eclipse.cdt.internal.core.search.matching.MatchLocator;
 import org.eclipse.cdt.internal.core.search.matching.OrPattern;
 
 
@@ -34,10 +33,6 @@
  */
 public class ClassDeclarationPatternTests extends BaseSearchTest implements ICSearchConstants {
 
-	private MatchLocator matchLocator;
-	
-	private String cppPath;
-	
 	public ClassDeclarationPatternTests(String name) {
 		super(name);
 	}

Back to the top