From ee74068fe89f2018b002a11372000214ca544ef2 Mon Sep 17 00:00:00 2001 From: Andrew Niefer Date: Thu, 21 Oct 2004 21:25:41 +0000 Subject: [PATCH] fix expansion of macros used as parameters to function-like macros --- .../parser/tests/scanner2/Scanner2Test.java | 31 +++++++++++++++++++ .../core/parser/scanner2/Scanner2.java | 4 +-- 2 files changed, 33 insertions(+), 2 deletions(-) diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/scanner2/Scanner2Test.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/scanner2/Scanner2Test.java index c580203c09c..50e43a3087b 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/scanner2/Scanner2Test.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/scanner2/Scanner2Test.java @@ -2191,4 +2191,35 @@ public class Scanner2Test extends BaseScanner2Test validateEOF(); } + + public void testMacroArgumentExpansion() throws Exception { + Writer writer = new StringWriter(); + writer.write( "#define g_return( expr ) ( expr ) \n" ); //$NON-NLS-1$ + writer.write( "#define ETH( obj ) ( CHECK( (obj), boo ) ) \n" ); //$NON-NLS-1$ + writer.write( "#define CHECK CHECK_INSTANCE \n" ); //$NON-NLS-1$ + writer.write( "#define CHECK_INSTANCE( instance, type ) (foo((instance), (type))) \n" ); //$NON-NLS-1$ + writer.write( "g_return( ETH(ooga) ) \n" ); //$NON-NLS-1$ + + initializeScanner( writer.toString() ); + + validateToken( IToken.tLPAREN ); + validateToken( IToken.tLPAREN ); + validateToken( IToken.tLPAREN ); + validateIdentifier( "foo" ); //$NON-NLS-1$ + validateToken( IToken.tLPAREN ); + validateToken( IToken.tLPAREN ); + validateToken( IToken.tLPAREN ); + validateIdentifier( "ooga" ); //$NON-NLS-1$ + validateToken( IToken.tRPAREN ); + validateToken( IToken.tRPAREN ); + validateToken( IToken.tCOMMA ); + validateToken( IToken.tLPAREN ); + validateIdentifier( "boo" ); //$NON-NLS-1$ + validateToken( IToken.tRPAREN ); + validateToken( IToken.tRPAREN ); + validateToken( IToken.tRPAREN ); + validateToken( IToken.tRPAREN ); + validateToken( IToken.tRPAREN ); + } + } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner2/Scanner2.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner2/Scanner2.java index a04e497c06e..3730e854893 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner2/Scanner2.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner2/Scanner2.java @@ -2641,10 +2641,10 @@ public class Scanner2 implements IScanner, IScannerData { char [] expansion = null; if( expObject instanceof FunctionStyleMacro ){ FunctionStyleMacro expMacro = (FunctionStyleMacro) expObject; - pushContext( ( start == 0 ) ? arg : CharArrayUtils.extract( arg, start, arg.length - start + 1 ) ); + pushContext( ( start == 0 ) ? arg : CharArrayUtils.extract( arg, start, arg.length - start ) ); bufferPos[bufferStackPos] += end - start + 1; expansion = handleFunctionStyleMacro( expMacro, false ); - end = bufferPos[bufferStackPos]; + end = bufferPos[bufferStackPos] + start; popContext(); } else if (expObject instanceof ObjectStyleMacro) { ObjectStyleMacro expMacro = (ObjectStyleMacro)expObject;