From e58b686575c4b0803c69ad4cd57e627b125a344a Mon Sep 17 00:00:00 2001 From: Andrew Niefer Date: Tue, 26 Oct 2004 15:50:51 +0000 Subject: [PATCH] 77010: IASTClassSpecifier#getDeclarations() returns incomplete information --- .../CompleteParseASTSymbolIteratorTest.java | 41 +++++++++++++++++ .../parser/tests/StructuralParseTest.java | 45 +++++++++++++++++++ .../core/parser/pst/ParserSymbolTable.java | 4 +- 3 files changed, 89 insertions(+), 1 deletion(-) diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/CompleteParseASTSymbolIteratorTest.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/CompleteParseASTSymbolIteratorTest.java index 18d60e51aa2..bf29e8b12ec 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/CompleteParseASTSymbolIteratorTest.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/CompleteParseASTSymbolIteratorTest.java @@ -370,4 +370,45 @@ public class CompleteParseASTSymbolIteratorTest extends CompleteParseBaseTest { assertEquals( i.next(), helper ); assertFalse( i.hasNext() ); } + + public void testBug77010() throws Exception + { + Writer writer = new StringWriter(); + writer.write(" struct Example{ \n"); //$NON-NLS-1$ + writer.write(" int *deref(); \n"); //$NON-NLS-1$ + writer.write(" int const *deref() const; \n"); //$NON-NLS-1$ + writer.write(" int volatile *deref() volatile; \n"); //$NON-NLS-1$ + writer.write(" int const volatile *deref() const volatile; \n"); //$NON-NLS-1$ + writer.write(" }; \n"); //$NON-NLS-1$ + + Iterator i = parse( writer.toString() ).getDeclarations(); + + IASTClassSpecifier Example = (IASTClassSpecifier) i.next(); + assertFalse( i.hasNext() ); + i = Example.getDeclarations(); + IASTMethod deref = (IASTMethod) i.next(); + assertFalse( deref.getReturnType().isConst() ); + assertFalse( deref.getReturnType().isVolatile() ); + assertFalse( deref.isConst() ); + assertFalse( deref.isVolatile() ); + + deref = (IASTMethod) i.next(); + assertTrue( deref.getReturnType().isConst() ); + assertFalse( deref.getReturnType().isVolatile() ); + assertTrue( deref.isConst() ); + assertFalse( deref.isVolatile() ); + + deref = (IASTMethod) i.next(); + assertFalse( deref.getReturnType().isConst() ); + assertTrue( deref.getReturnType().isVolatile() ); + assertFalse( deref.isConst() ); + assertTrue( deref.isVolatile() ); + + deref = (IASTMethod) i.next(); + assertTrue( deref.getReturnType().isConst() ); + assertTrue( deref.getReturnType().isVolatile() ); + assertTrue( deref.isConst() ); + assertTrue( deref.isVolatile() ); + assertFalse( i.hasNext() ); + } } diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/StructuralParseTest.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/StructuralParseTest.java index b52cafa0c39..032a16ad68a 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/StructuralParseTest.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/StructuralParseTest.java @@ -13,6 +13,8 @@ */ package org.eclipse.cdt.core.parser.tests; +import java.io.StringWriter; +import java.io.Writer; import java.util.Iterator; import junit.framework.TestCase; @@ -25,9 +27,12 @@ import org.eclipse.cdt.core.parser.ParserFactoryError; import org.eclipse.cdt.core.parser.ParserLanguage; import org.eclipse.cdt.core.parser.ParserMode; import org.eclipse.cdt.core.parser.ScannerInfo; +import org.eclipse.cdt.core.parser.ast.IASTAbstractTypeSpecifierDeclaration; +import org.eclipse.cdt.core.parser.ast.IASTClassSpecifier; import org.eclipse.cdt.core.parser.ast.IASTCompilationUnit; import org.eclipse.cdt.core.parser.ast.IASTFunction; import org.eclipse.cdt.core.parser.ast.IASTLinkageSpecification; +import org.eclipse.cdt.core.parser.ast.IASTMethod; import org.eclipse.cdt.core.parser.ast.IASTTemplateDeclaration; import org.eclipse.cdt.core.parser.ast.IASTVariable; import org.eclipse.cdt.internal.core.parser.ParserException; @@ -93,4 +98,44 @@ public class StructuralParseTest extends TestCase { IASTFunction foo = (IASTFunction) template.getOwnedDeclaration(); assertEquals( foo.getName(), "foo" ); //$NON-NLS-1$ } + + public void testBug77010() throws Exception + { + Writer writer = new StringWriter(); + writer.write(" struct Example{ \n"); //$NON-NLS-1$ + writer.write(" int *deref(); \n"); //$NON-NLS-1$ + writer.write(" int const *deref() const; \n"); //$NON-NLS-1$ + writer.write(" int volatile *deref() volatile; \n"); //$NON-NLS-1$ + writer.write(" int const volatile *deref() const volatile; \n"); //$NON-NLS-1$ + writer.write(" }; \n"); //$NON-NLS-1$ + + Iterator i = parse( writer.toString() ).getDeclarations(); + IASTClassSpecifier Ex = (IASTClassSpecifier) ((IASTAbstractTypeSpecifierDeclaration)i.next()).getTypeSpecifier(); + + i = Ex.getDeclarations(); + IASTMethod deref = (IASTMethod) i.next(); + assertFalse( deref.getReturnType().isConst() ); + assertFalse( deref.getReturnType().isVolatile() ); + assertFalse( deref.isConst() ); + assertFalse( deref.isVolatile() ); + + deref = (IASTMethod) i.next(); + assertTrue( deref.getReturnType().isConst() ); + assertFalse( deref.getReturnType().isVolatile() ); + assertTrue( deref.isConst() ); + assertFalse( deref.isVolatile() ); + + deref = (IASTMethod) i.next(); + assertFalse( deref.getReturnType().isConst() ); + assertTrue( deref.getReturnType().isVolatile() ); + assertFalse( deref.isConst() ); + assertTrue( deref.isVolatile() ); + + deref = (IASTMethod) i.next(); + assertTrue( deref.getReturnType().isConst() ); + assertTrue( deref.getReturnType().isVolatile() ); + assertTrue( deref.isConst() ); + assertTrue( deref.isVolatile() ); + assertFalse( i.hasNext() ); + } } 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 596da637555..c218f64a703 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 @@ -935,7 +935,9 @@ public class ParserSymbolTable { //if none of them are static, then the function can be overloaded if they differ in the type //of their implicit object parameter. - if( origSymbol.compareCVQualifiersTo( newSymbol ) != 0 ){ + if( (origSymbol.getTypeInfo().getTypeBits()& ( ITypeInfo.isConst | ITypeInfo.isVolatile )) != + (newSymbol.getTypeInfo().getTypeBits() & ( ITypeInfo.isConst | ITypeInfo.isVolatile )) ) + { return true; }