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

org.eclipse.cdt.core : Partial fix for https://bugs.eclipse.org/bugs/show_bug.cgi?id=39697 <BR>

org.eclipse.cdt.core.tests : Added CompleteParseASTTest::testBug39697().
This commit is contained in:
John Camelon 2004-04-15 21:00:18 +00:00
parent df56f209bb
commit b1c5ca5c96
5 changed files with 91 additions and 13 deletions

View file

@ -1,3 +1,6 @@
2004-04-15 John Camelon
Added CompleteParseASTTest::testBug39697().
2004-04-15 Andrew Niefer
added parser/org/eclipse/cdt/core/parser/tests/CompleteParseASTTest.testBug57791()

View file

@ -1511,4 +1511,43 @@ public class CompleteParseASTTest extends CompleteParseBaseTest
assertEquals( f_SD_01.getName(), "f_SD_01");
assertAllReferences( 1, createTaskList( new Task( SD_01 )));
}
public void testBug39697() throws Exception
{
Writer writer = new StringWriter();
writer.write( "__asm__( \"CODE\" );\n" );
writer.write( "__inline__ int foo() { return 4; }\n");
writer.write( "__const__ int constInt;\n");
writer.write( "__volatile__ int volInt;\n");
writer.write( "__signed__ int signedInt;\n");
Iterator i = parse( writer.toString() ).getDeclarations();
IASTASMDefinition asmDefinition = (IASTASMDefinition) i.next();
assertEquals( asmDefinition.getBody(), "CODE");
IASTFunction foo = (IASTFunction) i.next();
assertTrue( foo.isInline() );
IASTVariable constInt = (IASTVariable) i.next();
assertTrue( constInt.getAbstractDeclaration().isConst());
IASTVariable volInt = (IASTVariable) i.next();
assertTrue( volInt.getAbstractDeclaration().isVolatile() );
IASTVariable signedInt = (IASTVariable) i.next();
assertTrue( ((IASTSimpleTypeSpecifier) signedInt.getAbstractDeclaration().getTypeSpecifier()).isSigned() );
assertFalse( i.hasNext() );
writer = new StringWriter();
writer.write( "int * __restrict__ resPointer1;\n");
writer.write( "int * __restrict resPointer2;\n");
i = parse( writer.toString(), true, ParserLanguage.C ).getDeclarations();
int count = 0;
while( i.hasNext() )
{
++count;
IASTVariable resPointer = (IASTVariable) i.next();
Iterator pOps = resPointer.getAbstractDeclaration().getPointerOperators();
assertTrue( pOps.hasNext() );
ASTPointerOperator op = (ASTPointerOperator) pOps.next();
assertFalse( pOps.hasNext() );
assertEquals( op, ASTPointerOperator.RESTRICT_POINTER );
}
assertEquals( count, 2 );
}
}

View file

@ -1,3 +1,6 @@
2004-04-15 John Camelon
Partial fix for https://bugs.eclipse.org/bugs/show_bug.cgi?id=39697
2004-04-15 John Camelon
Fixed https://bugs.eclipse.org/bugs/show_bug.cgi?id=58175

View file

@ -18,6 +18,7 @@ import java.util.Set;
import org.eclipse.cdt.core.parser.CodeReader;
import org.eclipse.cdt.core.parser.IScanner;
import org.eclipse.cdt.core.parser.Keywords;
import org.eclipse.cdt.core.parser.ParserLanguage;
import org.eclipse.cdt.core.parser.ast.IASTInclusion;
import org.eclipse.cdt.core.parser.extension.IScannerExtension;
@ -30,16 +31,29 @@ import org.eclipse.cdt.internal.core.parser.util.TraceUtil;
public class GCCScannerExtension implements IScannerExtension {
private static final String __CONST__ = "__const__"; //$NON-NLS-1$
private static final String __INLINE__ = "__inline__"; //$NON-NLS-1$
private static final String __VOLATILE__ = "__volatile__"; //$NON-NLS-1$
private static final String __SIGNED__ = "__signed__"; //$NON-NLS-1$
private static final String __RESTRICT = "__restrict"; //$NON-NLS-1$
private static final String __RESTRICT__ = "__restrict__"; //$NON-NLS-1$
private static final String __ASM__ = "__asm__"; //$NON-NLS-1$
private IScannerData scannerData;
private static final String __ATTRIBUTE__ = "__attribute__";
private static final String __DECLSPEC = "__declspec";
private static final String __ATTRIBUTE__ = "__attribute__"; //$NON-NLS-1$
private static final String __DECLSPEC = "__declspec"; //$NON-NLS-1$
private static final List EMPTY_LIST = new ArrayList();
private static final List simpleIdentifiers;
private static final List simpleIdentifiersDeclSpec;
private static final List simpleIdentifiersAttribute;
static
{
simpleIdentifiers = new ArrayList();
simpleIdentifiers.add( "x" ); //$NON-NLS-1
simpleIdentifiersDeclSpec = new ArrayList( 1 );
simpleIdentifiersDeclSpec.add( "x" ); //$NON-NLS-1$
simpleIdentifiersAttribute = new ArrayList( 1 );
simpleIdentifiersAttribute.add( "xyz"); //$NON-NLS-1$
}
/* (non-Javadoc)
* @see org.eclipse.cdt.core.parser.IScannerExtension#initializeMacroValue(java.lang.String)
@ -56,23 +70,42 @@ public class GCCScannerExtension implements IScannerExtension {
public void setupBuiltInMacros(ParserLanguage language) {
if( scannerData.getScanner().getDefinition( __ATTRIBUTE__) == null )
{
scannerData.getScanner().addDefinition( __ATTRIBUTE__, new FunctionMacroDescriptor( __ATTRIBUTE__, simpleIdentifiers, EMPTY_LIST, "" )); //$NON-NLS-1$ $NON-NLS-2$
}
scannerData.getScanner().addDefinition( __ATTRIBUTE__, new FunctionMacroDescriptor( __ATTRIBUTE__, simpleIdentifiersDeclSpec, EMPTY_LIST, "" )); //$NON-NLS-1$ $NON-NLS-2$
if( scannerData.getScanner().getDefinition( __DECLSPEC) == null )
{
scannerData.getScanner().addDefinition( __DECLSPEC, new FunctionMacroDescriptor( __ATTRIBUTE__, simpleIdentifiers, EMPTY_LIST, "" )); //$NON-NLS-1$ $NON-NLS-2$
}
scannerData.getScanner().addDefinition( __DECLSPEC, new FunctionMacroDescriptor( __ATTRIBUTE__, simpleIdentifiersDeclSpec, EMPTY_LIST, "" )); //$NON-NLS-1$ $NON-NLS-2$
if( language == ParserLanguage.CPP )
if( scannerData.getScanner().getDefinition( IScanner.__CPLUSPLUS ) == null )
scannerData.getScanner().addDefinition( IScanner.__CPLUSPLUS, new ObjectMacroDescriptor( IScanner.__CPLUSPLUS, "1")); //$NON-NLS-1$
if( scannerData.getScanner().getDefinition(IScanner.__STDC_HOSTED__) == null )
scannerData.getScanner().addDefinition(IScanner.__STDC_HOSTED__, new ObjectMacroDescriptor( IScanner.__STDC_HOSTED__, "0")); //$NON-NLS-1$
if( scannerData.getScanner().getDefinition( IScanner.__STDC_VERSION__) == null )
scannerData.getScanner().addDefinition( IScanner.__STDC_VERSION__, new ObjectMacroDescriptor( IScanner.__STDC_VERSION__, "199001L")); //$NON-NLS-1$
setupAlternativeKeyword(__CONST__, Keywords.CONST);
setupAlternativeKeyword(__INLINE__, Keywords.INLINE);
setupAlternativeKeyword(__SIGNED__, Keywords.SIGNED);
setupAlternativeKeyword(__VOLATILE__, Keywords.VOLATILE);
if( language == ParserLanguage.C )
{
setupAlternativeKeyword( __RESTRICT, Keywords.RESTRICT);
setupAlternativeKeyword( __RESTRICT__, Keywords.RESTRICT);
}
else
setupAlternativeKeyword( __ASM__, Keywords.ASM );
}
/**
*
*/
protected void setupAlternativeKeyword(String keyword, String mapping) {
// alternate keyword forms
// TODO - make this more efficient - update TokenFactory to avoid a context push for these token to token cases
if( scannerData.getScanner().getDefinition( keyword ) == null )
scannerData.getScanner().addDefinition( keyword, new ObjectMacroDescriptor( __CONST__, mapping )); //$NON-NLS-1$
}
public void setScannerData(IScannerData scannerData) {

View file

@ -21,7 +21,7 @@ import org.eclipse.cdt.core.parser.IToken;
*/
public class ObjectMacroDescriptor implements IMacroDescriptor {
private static final ArrayList EMPTY_LIST = new ArrayList();
private static final ArrayList EMPTY_LIST = new ArrayList(0);
private final String expansionSignature;
private final String name;
private final IToken token;