From 05ca77b4259cac2924df29e93691097081d5b2eb Mon Sep 17 00:00:00 2001 From: Andrew Niefer Date: Fri, 17 Sep 2004 20:58:49 +0000 Subject: [PATCH] fix 72691 - [Parser] time_t is unresolved type --- .../parser/tests/CompleteParseASTTest.java | 25 +++++++++++++++++++ .../ast/complete/CompleteParseASTFactory.java | 2 +- .../core/parser/pst/ParserSymbolTable.java | 20 ++++++++++++++- 3 files changed, 45 insertions(+), 2 deletions(-) diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/CompleteParseASTTest.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/CompleteParseASTTest.java index 60aa6e71426..7f44f288c9b 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/CompleteParseASTTest.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/CompleteParseASTTest.java @@ -2087,5 +2087,30 @@ public class CompleteParseASTTest extends CompleteParseBaseTest parse( "enum DHCPFOBoolean { false, true } additionalHB, more_payload; \n", true, ParserLanguage.C ); assertTrue( callback.problems.isEmpty() ); } + + public void testBug72691() throws Exception{ + StringWriter writer = new StringWriter(); + writer.write( "typedef int * PINT; \n" ); + writer.write( "typedef int * PINT; \n" ); + writer.write( "PINT pint; \n" ); + Iterator i = parse( writer.toString() ).getDeclarations(); + assertTrue( i.next() instanceof IASTTypedefDeclaration ); + assertTrue( i.next() instanceof IASTTypedefDeclaration ); + assertTrue( i.next() instanceof IASTVariable); + assertFalse( i.hasNext() ); + assertTrue( callback.problems.isEmpty() ); + } + + public void testBug72691_2() throws Exception{ + StringWriter writer = new StringWriter(); + writer.write( "typedef int * PINT; \n" ); + writer.write( "namespace N { \n" ); + writer.write( " typedef int * PINT; \n" ); + writer.write( "} \n" ); + writer.write( "using namespace N; \n" ); + writer.write( "PINT pint; \n" ); + parse( writer.toString() ); + assertTrue( callback.problems.isEmpty() ); + } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/complete/CompleteParseASTFactory.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/complete/CompleteParseASTFactory.java index 0cbbfb06f33..bc6bd7ea8b4 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/complete/CompleteParseASTFactory.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/complete/CompleteParseASTFactory.java @@ -3152,7 +3152,7 @@ public class CompleteParseASTFactory extends BaseASTFactory implements IASTFacto } catch (ParserSymbolTableException e) { - handleProblem(e.createProblemID(), name ); + handleProblem(e.createProblemID(), name, nameOffset, nameEndOffset, nameLine, true ); } ASTTypedef d = new ASTTypedef( typeSymbol, mapping, startingOffset, startingLine, nameOffset, nameEndOffset, nameLine, references, filename ); attachSymbolExtension(typeSymbol, d, true ); diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/pst/ParserSymbolTable.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/pst/ParserSymbolTable.java index 5e425bc62e0..03be0a3bb46 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/pst/ParserSymbolTable.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/pst/ParserSymbolTable.java @@ -529,7 +529,15 @@ public class ParserSymbolTable { obj = foundSymbol; else if( foundSymbol.isForwardDeclaration() && foundSymbol.getForwardSymbol() == obj ){ //we already have what we want. - } else if( data.isPrefixLookup() ){ + } + else if( foundSymbol.getTypeInfo().checkBit(ITypeInfo.isTypedef ) && + obj.getTypeInfo().checkBit( ITypeInfo.isTypedef ) && + foundSymbol.getTypeInfo().getFinalType( null ).equals(obj.getTypeInfo().getFinalType( null ) )) + { + //two typedef's with matching name, if they are typedefed to the same thing, + //then its all good and we already have the one we want. (7.1.3-2) + } + else if( data.isPrefixLookup() ){ data.addAmbiguity( foundSymbol.getName() ); } else { throw new ParserSymbolTableException( ParserSymbolTableException.r_Ambiguous ); @@ -835,6 +843,16 @@ public class ParserSymbolTable { //allowable thing is if they are both functions. if( origSymbol instanceof IParameterizedSymbol && newSymbol instanceof IParameterizedSymbol ) return isValidFunctionOverload( (IParameterizedSymbol) origSymbol, (IParameterizedSymbol) newSymbol ); + + if( origSymbol.getTypeInfo().checkBit( ITypeInfo.isTypedef ) && newSymbol.getTypeInfo().checkBit( ITypeInfo.isTypedef ) ){ + TypeInfoProvider provider = origSymbol.getSymbolTable().getTypeInfoProvider(); + ITypeInfo origFlat = origSymbol.getTypeInfo().getFinalType( provider ); + ITypeInfo newFlat = origSymbol.getTypeInfo().getFinalType( provider ); + boolean equals = origFlat.equals( newFlat ); + provider.returnTypeInfo( origFlat ); + provider.returnTypeInfo( newFlat ); + return equals; + } return false; }