diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2Tests.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2Tests.java index 89324e0764f..c52b8afee3e 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2Tests.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2Tests.java @@ -3112,4 +3112,18 @@ public class AST2Tests extends AST2BaseTest { } assertEquals( count, sum ); } + + public void testBug94365() throws Exception { + StringBuffer buffer = new StringBuffer(); + buffer.append( "#define ONE(a, ...) int x\n"); //$NON-NLS-1$ + buffer.append( "#define TWO(b, args...) int y\n"); //$NON-NLS-1$ + buffer.append( "int main()\n"); //$NON-NLS-1$ + buffer.append( "{\n"); //$NON-NLS-1$ + buffer.append( "ONE(\"string\"); /* err */\n"); //$NON-NLS-1$ + buffer.append( "TWO(\"string\"); /* err */\n"); //$NON-NLS-1$ + buffer.append( "return 0; \n"); //$NON-NLS-1$ + buffer.append( "}\n"); //$NON-NLS-1$ + + parse( buffer.toString(), ParserLanguage.C ); + } } \ No newline at end of file diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner2/BaseScanner.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner2/BaseScanner.java index dbc98e371db..7fed1afbbbd 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner2/BaseScanner.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner2/BaseScanner.java @@ -3997,14 +3997,20 @@ abstract class BaseScanner implements IScanner { argmap.put(arglist[currarg], arg); } - int numArgs = arglist.length; + int numRequiredArgs = arglist.length; for (int i = 0; i < arglist.length; i++) { if (arglist[i] == null) { - numArgs = i; + numRequiredArgs = i; break; } } - if (argmap.size() < numArgs) { + + /* Don't require a match for the vararg placeholder */ + /* Workaround for bugzilla 94365 */ + if (macro.hasGCCVarArgs()|| macro.hasVarArgs()) + numRequiredArgs--; + + if (argmap.size() < numRequiredArgs) { handleProblem(IProblem.PREPROCESSOR_MACRO_USAGE_ERROR, bufferPos[bufferStackPos], macro.name); }