/******************************************************************************* * Copyright (c) 2004, 2012 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * IBM - Initial API and implementation * Markus Schorn (Wind River Systems) *******************************************************************************/ package org.eclipse.cdt.core.parser.tests.scanner; import junit.framework.TestSuite; import org.eclipse.cdt.core.parser.IProblem; import org.eclipse.cdt.core.parser.IToken; /** * Scanner2Tests ported to use the CPreprocessor plus additional bugs fixed in * the CPreprocessor, afterwards. */ public class PreprocessorBugsTests extends PreprocessorTestsBase { public static TestSuite suite() { return suite(PreprocessorBugsTests.class); } // #define NOP(x) x // #define CPUINC(cpu) <NOP(reg)NOP(cpu).sfr> // #include CPUINC(xag4) public void testMacroInInclusion_Bug122891() throws Exception { initializeScanner(); validateEOF(); validateProblem(0, IProblem.PREPROCESSOR_INCLUSION_NOT_FOUND, "<regxag4.sfr>"); validateProblemCount(1); } // #define FUNKY(x) __##x##__ // #define __foo__ 127 // // #if FUNKY(foo) == 0x7f // #define MSG "hello" // #else // #define MSG "goodbye" // #endif // MSG public void testTokenPaste_Bug210344() throws Exception { initializeScanner(); validateString("hello"); validateEOF(); validateProblemCount(0); } // #ifndef PREFIX // #define PREFIX // #endif // #define STRING(x) #x // #define CONCAT(x,y) STRING(x##y) // #define EXPAND(x,y) CONCAT(x,y) // #define PREFIXED(x) EXPAND(PREFIX,x) // #include PREFIXED(bar.h) public void testEmptyStringInMacroInInclusion_Bug145270() throws Exception { initializeScanner(); validateEOF(); validateProblem(0, IProblem.PREPROCESSOR_INCLUSION_NOT_FOUND, "\"bar.h\""); validateProblemCount(1); } // #define D // #if defined D // x; // #endif // #if defined(D) // y; // #endif public void testBug186047() throws Exception { initializeScanner(); validateIdentifier("x"); validateToken(IToken.tSEMI); validateIdentifier("y"); validateToken(IToken.tSEMI); validateEOF(); validateProblemCount(0); } // __CDT_PARSER__ public void testPredefinedCDTMacro_Bug173848() throws Exception { initializeScanner(); validateInteger("1"); validateEOF(); validateProblemCount(0); } // #define FOO(ARG) defined(ARG##_BAZ) // #define BAR_BAZ UNDEFINED // #if FOO(BAR) // juhuu // #else // ojeh // #endif // FOO(BAR) // here expansion has to take place // // #define PLATFORM(WTF_FEATURE) (defined( WTF_PLATFORM_##WTF_FEATURE ) && WTF_PLATFORM_##WTF_FEATURE) // #define WTF_PLATFORM_FOO 1 // #if PLATFORM(FOO) // ok // #endif public void testIndirectDefined_Bug225562() throws Exception { initializeScanner(); validateIdentifier("juhuu"); validateIdentifier("defined"); validateToken(IToken.tLPAREN); validateIdentifier("UNDEFINED"); // here the expansion has to take place validateToken(IToken.tRPAREN); validateIdentifier("ok"); validateEOF(); validateProblemCount(0); } // "unintentionally unbounded // " // public void testUnboundedEmptyStringLiteral_Bug190884() throws Exception { initializeScanner(); validateString("unintentionally unbounded"); validateEOF(); validateProblemCount(2); } // #if true // yes // #else // no // #endif // #if false // no // #else // yes // #endif public void testTrueInConditionalExpression_Bug246369() throws Exception { initializeScanner(); validateIdentifier("yes"); validateIdentifier("yes"); validateEOF(); validateProblemCount(0); } // #if if // no // #else // yes // #endif // #if or // no // #endif public void testKeywordsInConditionalExpression_Bug246369() throws Exception { initializeScanner(); validateIdentifier("yes"); validateEOF(); validateProblemCount(1); validateProblem(0, IProblem.SCANNER_EXPRESSION_SYNTAX_ERROR, null); } // #define BAR1_RX_BLOCK_SIZE 1 // #define MAX(__x,__y) ((__x)>(__y)?(__x):(__y)) // #define BAR_BLOCK_SIZE (MAX(BAR1_RX_BLOCK_SIZE, // int main(void) { // BAR_BLOCK_SIZE; // } public void testMissingClosingParenthesis_Bug251734() throws Exception { initializeScanner(); validateToken(IToken.t_int); validateIdentifier("main"); validateToken(IToken.tLPAREN); validateToken(IToken.t_void); validateToken(IToken.tRPAREN); validateToken(IToken.tLBRACE); validateToken(IToken.tLPAREN); validateEOF(); validateProblemCount(1); validateProblem(0, IProblem.PREPROCESSOR_MISSING_RPAREN_PARMLIST, null); } // /**/ #if 0 // bug // /**/ #endif // passed // // /* // */ #if 0 // bug // /**/ #endif // passed // // #if 0 // /**/ #else // OK1 // #endif // // #if 0 // /* // */ #else // OK2 // #endif // // #if 0 // a /**/ #else // bug // #endif // passed // // #if 0 // a /* // */ #else // interesting, gcc ignores this directive, we mimic the behavior // bug // #endif // passed public void testCommentBeforeDirective_Bug255318() throws Exception { initializeScanner(); validateIdentifier("passed"); validateIdentifier("passed"); validateIdentifier("OK1"); validateIdentifier("OK2"); validateIdentifier("passed"); validateIdentifier("passed"); validateEOF(); validateProblemCount(0); } // #define ID(x) x // ID( // #include "bbb" // ) // passed1 // // ID( // #if ID(b) // #elif ID(c) // #else // d // #endif // ) // passed2 // ID( // #if 0 // #include "bbb" // #endif // ) // passed3 public void testDirectiveInExpansion_Bug240194() throws Exception { initializeScanner(); validateIdentifier("passed1"); validateIdentifier("d"); validateIdentifier("passed2"); validateIdentifier("passed3"); validateEOF(); validateProblemCount(2); // the inclusions } // #define UNFOLD(v,x) v:x // UNFOLD("A", // #ifdef X // "B") // #else // "C") /* parse error in this line */ // #endif public void testDirectiveInExpansion_Bug375739() throws Exception { initializeScanner(); validateString("A"); validateToken(IToken.tCOLON); validateString("C"); validateEOF(); validateProblemCount(0); } // #if 0xe000 // ok // #endif // 0x1p2 0xe0 public void testHexConstant_Bug265927() throws Exception { initializeScanner(); validateIdentifier("ok"); validateFloatingPointLiteral("0x1p2"); validateInteger("0xe0"); validateEOF(); validateProblemCount(0); } // #error // // #warning // // #pragma // not marked as problem // #define // // #include // // #undef // // #if // // #endif // #ifdef // // #endif // #ifndef // // #endif // #if 0 // #elif // // #endif // a public void testMissingArgument_Bug303969() throws Exception { initializeScanner(); validateIdentifier("a"); validateEOF(); validateProblemCount(9); } // #define str(x) #x // #define xstr(x) str(x) // #define MY_MACROS(Type) unsigned ##Type f(); // xstr(MY_MACROS(int)) public void testStringify_Bug282418() throws Exception { initializeScanner(); validateString("unsignedint f();"); validateEOF(); } // #if '\0' // no // #else // yes // #endif // #if '\1' // yes // #else // no // #endif public void testOcatalCharConstant_Bug330747() throws Exception { initializeScanner(); validateIdentifier("yes"); validateIdentifier("yes"); validateEOF(); validateProblemCount(0); } // #define foo(x) (## x) // void test foo(void); // Valid for Microsoft's compiler, expands to (void) public void testInvalidTokenPasting_Bug354553() throws Exception { initializeScanner(); validateToken(IToken.t_void); validateIdentifier("test"); validateToken(IToken.tLPAREN); validateToken(IToken.t_void); validateToken(IToken.tRPAREN); validateToken(IToken.tSEMI); validateEOF(); validateProblem(0, IProblem.PREPROCESSOR_MACRO_PASTING_ERROR, "foo"); validateProblemCount(1); } // #define PR "" // A // #ifdef _DEBUG // PR""; // #endif // B public void testRawString_Bug362562() throws Exception { initializeScanner(); validateIdentifier("A"); validateIdentifier("B"); validateProblemCount(0); } // __COUNTER__ // __COUNTER__ public void testCounter_Bug362148() throws Exception { initializeScanner(); validateInteger("0"); validateInteger("1"); validateProblemCount(0); } }