1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-06-06 17:26:01 +02:00

Patch for Victor Mozgin.

Fixed PR 39553 : Macros are not expanded in #include statements.
This commit is contained in:
John Camelon 2003-07-28 00:02:34 +00:00
parent 432273ae87
commit 136320038c
8 changed files with 117 additions and 62 deletions

View file

@ -1,6 +1,10 @@
2003-07-25 Bogdan Gheorghe
Added new indexer test for refs
2003-07-25 Victor Mozgin
Moved testBug39553() from ASTFailedTests.java to QuickParseASTTests.java.
Fixed IIncludeTest.h and IIncludeTests.java with #include macro tests.
2003-07-24 John Camelon
Updated CompleteParseASTTests for Method/Field updates.
Fixed TortureTest's parser mode switch (was always QuickParsing).

View file

@ -145,11 +145,6 @@ public class ASTFailedTests extends BaseASTTest
assertEquals( variable.getName(), "id");
}
public void testBug39553() throws Exception
{
parse("#define COMP_INC \"foobar.h\" \n" + "#include COMP_INC");
assertFalse( quickParseCallback.getInclusions().hasNext() );
}
public void testBug39554() throws Exception
{
assertCodeFailsParse("_Pragma(\"foobar\")");

View file

@ -76,11 +76,11 @@ public class IIncludeTests extends IntegratedCModelTest {
new String("whitespace_before_hash"),
new String("resync_after_bad_parse_1"),
new String("resync_after_bad_parse_2"),
new String("one"), // C-spec does not allow this, but that's OK for our present purposes
new String("onetwothree"), // C-spec does not allow this, but that's OK for our present purposes
new String("resync_after_bad_parse_3"),
new String("invalid.h"), // C-spec does not allow this, but that's OK for our present purposes
// TODO: expect new String("MYINCFILE"),
// TODO: expect new String("xstr(INCFILE(2)).h")
new String("myInclude1.h"),
new String("vers2.h")
};
assertEquals( getIncludeNameList.length, theIncludes.length );
for( int i=0; i<getIncludeNameList.length; i++ )

View file

@ -1157,8 +1157,8 @@ public class QuickParseASTTests extends BaseASTTest
assertEquals( i.getName(), "stdio.h");
assertEquals( i.getStartingOffset(), 0 );
assertEquals( i.getNameOffset(), 10 );
assertEquals( i.getEndingOffset(), 18 );
assertEquals( i.getNameOffset(), 9 );
assertEquals( i.getEndingOffset(), 19 );
IASTMacro m = (IASTMacro)macros.next();
@ -1703,4 +1703,10 @@ public class QuickParseASTTests extends BaseASTTest
parse(code.toString());
}
public void testBug39553() throws Exception
{
parse("#define COMP_INC \"foobar.h\" \n" + "#include COMP_INC");
assertTrue( quickParseCallback.getInclusions().hasNext() );
}
}

View file

@ -1241,7 +1241,7 @@ public class ScannerTestCase extends BaseScannerTest
initializeScanner( writer.toString() );
validateIdentifier("fputs");
validateToken(IToken.tLPAREN);
validateString("strncmp ( \\\"abc\\\\0d\\\" , \\\"abc\\\" , '\\\\4' ) == 0");
validateString("strncmp(\\\"abc\\\\0d\\\", \\\"abc\\\", '\\\\4') == 0");
validateToken(IToken.tCOMMA);
validateIdentifier("s");
validateToken(IToken.tRPAREN);
@ -1270,7 +1270,7 @@ public class ScannerTestCase extends BaseScannerTest
try{
validateEOF();
} catch ( ScannerException e ){
assertTrue( e.getMessage().equals( "Ill-formed #include: reached end of line before \"" ));
assertTrue( e.getMessage().equals( "Unbounded string" ));
}
initializeScanner( "#include <foo.h" );

View file

@ -38,5 +38,5 @@ EMPTY #include "invalid.h"
#define INCFILE(x) vers ## x
#define xstr(x) str(x)
#define str(x) #x
#include xstr(INCFILE(2)).h
#include xstr(INCFILE(2).h)

View file

@ -1,3 +1,6 @@
2003-07-25 Victor Mozgin
Fixed PR 39553 : Macros are not expanded in #include statements.
2003-07-24 John Camelon
Added COMPLETE_PARSE support for Method and Field declarations and cross-references.
Fixed some small ParserSymbolTable bugs.

View file

@ -1872,70 +1872,111 @@ public class Scanner implements IScanner {
}
protected void poundInclude( int beginningOffset ) throws ScannerException {
skipOverWhitespace();
int c = getChar();
int offset;
if( c == '/' ){
c = getChar();
if( c == '*' ){
skipOverMultilineComment();
skipOverWhitespace();
c = getChar();
} else {
if( throwExceptionOnBadPreprocessorSyntax )
throw new ScannerException( "Encountered ill-formed #include" );
else return;
}
}
skipOverWhitespace();
int baseOffset = lastContext.getOffset() - lastContext.undoStackSize();
String includeLine = getRestOfPreprocessorLine();
StringBuffer fileName = new StringBuffer();
boolean useIncludePath = true;
int endChar = -1;
if( c == '<' ){
endChar = '>';
} else if ( c == '"' ){
endChar = '"';
useIncludePath = false;
} else {
if( throwExceptionOnBadPreprocessorSyntax )
throw new ScannerException( "Encountered ill-formed #include");
else return;
}
c = getChar();
while ((c != '\n') && (c != endChar) && (c != NOCHAR)){
if( c == '\r' ){
c = getChar();
continue;
}
fileName.append((char) c);
c = getChar();
}
int startOffset = baseOffset;
int endOffset = baseOffset;
if( c != endChar ){
if( throwExceptionOnBadPreprocessorSyntax )
throw new ScannerException( "Ill-formed #include: reached end of line before " + (char)endChar );
else return;
if (! includeLine.equals("")) {
Scanner helperScanner = new Scanner(
new StringReader(includeLine),
null,
new ScannerInfo(definitions, originalConfig.getIncludePaths()),
problemReporter,
translationResult,
new NullSourceElementRequestor(),
mode);
IToken t = null;
try {
t = helperScanner.nextToken(false);
} catch (EndOfFile eof) {
if (throwExceptionOnBadPreprocessorSyntax) {
throw new ScannerException( "Encountered ill-formed #include" );
}
return;
}
try {
if (t.getType() == IToken.tSTRING) {
fileName.append(t.getImage());
startOffset = baseOffset + t.getOffset();
endOffset = baseOffset + t.getEndOffset();
useIncludePath = false;
// This should throw EOF
t = helperScanner.nextToken(false);
if (throwExceptionOnBadPreprocessorSyntax) {
throw new ScannerException( "Encountered ill-formed #include" );
}
return;
} else if (t.getType() == IToken.tLT) {
try {
startOffset = baseOffset + t.getOffset();
t = helperScanner.nextToken(false);
while (t.getType() != IToken.tGT) {
fileName.append(t.getImage());
helperScanner.skipOverWhitespace();
int c = helperScanner.getChar();
if (c == '\\') fileName.append('\\'); else helperScanner.ungetChar(c);
t = helperScanner.nextToken(false);
}
endOffset = baseOffset + t.getEndOffset();
} catch (EndOfFile eof) {
if (throwExceptionOnBadPreprocessorSyntax) {
throw new ScannerException( "Ill-formed #include: reached end of line before >" );
}
return;
}
// This should throw EOF
t = helperScanner.nextToken(false);
if (throwExceptionOnBadPreprocessorSyntax) {
throw new ScannerException( "Encountered ill-formed #include" );
}
return;
} else if (throwExceptionOnBadPreprocessorSyntax) {
throw new ScannerException( "Encountered ill-formed #include" );
}
}
catch( EndOfFile eof )
{
// good
}
} else if (throwExceptionOnBadPreprocessorSyntax) {
throw new ScannerException( "Encountered ill-formed #include" );
}
String f = fileName.toString();
offset = contextStack.getCurrentContext().getOffset() - f.length() - 1; // -1 for the end quote
if( mode == ParserMode.QUICK_PARSE )
{
if( requestor != null )
{
IASTInclusion i = astFactory.createInclusion( f, "", !useIncludePath, beginningOffset,
contextStack.getCurrentContext().getOffset(), offset );
endOffset, startOffset );
i.enterScope( requestor );
i.exitScope( requestor );
}
}
else
handleInclusion(f.trim(), useIncludePath, offset, beginningOffset, contextStack.getCurrentContext().getOffset() );
handleInclusion(f.trim(), useIncludePath, startOffset, beginningOffset, endOffset);
}
protected void poundDefine(int beginning) throws ScannerException, EndOfFile {
@ -2097,7 +2138,7 @@ public class Scanner implements IScanner {
protected Vector getMacroParameters (String params, boolean forStringizing) throws ScannerException {
IScanner tokenizer = ParserFactory.createScanner(new StringReader(params), TEXT, new ScannerInfo( definitions, originalConfig.getIncludePaths() ), mode, new NullSourceElementRequestor(), problemReporter, translationResult );
Scanner tokenizer = new Scanner(new StringReader(params), TEXT, new ScannerInfo( definitions, originalConfig.getIncludePaths() ), problemReporter, translationResult, new NullSourceElementRequestor(), mode);
Vector parameterValues = new Vector();
Token t = null;
String str = new String();
@ -2106,6 +2147,12 @@ public class Scanner implements IScanner {
try {
while (true) {
int c = tokenizer.getChar();
if ((c != ' ') && (c != '\t') && (c != '\r') && (c != '\n')) {
space = false;
}
if (c != NOCHAR) tokenizer.ungetChar(c);
t = (Token)(forStringizing ? tokenizer.nextTokenForStringizing() : tokenizer.nextToken(false));
if (t.type == IToken.tLPAREN) {
nParen++;
@ -2261,7 +2308,7 @@ public class Scanner implements IScanner {
if( t.getType() != tPOUNDPOUND && ! pastingNext )
if (i < (numberOfTokens-1)) // Do not append to the last one
buffer.append( " " );
buffer.append( " " );
}
String finalString = buffer.toString();
contextStack.updateContext(