Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
195 changes: 195 additions & 0 deletions test.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -691,6 +691,181 @@ static void define13()
"}", preprocess(code));
}

static void define14() // #296
{
const char code[] = "#define bar(x) x % 2\n"
"#define foo(x) printf(#x \"\\n\")\n"
"\n"
" foo(bar(3));\n";
ASSERT_EQUALS("\n"
"\n"
"\n"
"printf ( \"bar(3)\" \"\\n\" ) ;", preprocess(code));
}

static void define15() // #231
{
const char code[] = "#define CAT(a, b) CAT2(a, b)\n"
"#define CAT2(a, b) a ## b\n"
"#define FOO x\n"
"#define BAR() CAT(F, OO)\n"
"#define BAZ CAT(B, AR)()\n"
"BAZ\n";
ASSERT_EQUALS("\n"
"\n"
"\n"
"\n"
"\n"
"x", preprocess(code));
}

static void define16() // #201
{
const char code[] = "#define ALL_COLORS(warm_colors) \\\n"
" X(Blue) \\\n"
" X(Green) \\\n"
" X(Purple) \\\n"
" warm_colors\n"
"\n"
"#define WARM_COLORS \\\n"
" X(Red) \\\n"
" X(Yellow) \\\n"
" X(Orange)\n"
"\n"
"#define COLOR_SET ALL_COLORS(WARM_COLORS)\n"
"\n"
"#define X(color) #color,\n"
"\n"
"COLOR_SET\n";
ASSERT_EQUALS("\n"
"\n"
"\n"
"\n"
"\n"
"\n"
"\n"
"\n"
"\n"
"\n"
"\n"
"\n"
"\n"
"\n"
"\n"
"\"Blue\" , \"Green\" , \"Purple\" , \"Red\" , \"Yellow\" , \"Orange\" ,", preprocess(code));
}

static void define17() // #185
{
const char code[] = "#define at(x, y) x##y\n"
"#define b(...) \\\n"
"aa(__VA_ARGS__, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , \\\n"
", , , , , , , , 2)\n"
"#define aa(c, d, a, b, e, f, g, h, ab, ac, i, ad, j, k, l, m, n, o, p, ae, q, \\\n"
"r, s, t, u, v, w, x, y, z, af, ag, ah, ai, aj, ak, al, am, an, ao, \\\n"
"ap) \\\n"
"ap\n"
"#define aq(...) ar(b(__VA_ARGS__), __VA_ARGS__) static_assert(true, \" \")\n"
"#define ar(ap, ...) at(I_, ap)(__VA_ARGS__)\n"
"#define I_2(as, a)\n"
"aq(a, array);\n";
ASSERT_EQUALS("\n"
"\n"
"\n"
"\n"
"\n"
"\n"
"\n"
"\n"
"\n"
"\n"
"\n"
"static_assert ( true , \" \" ) ;", preprocess(code));
}

static void define18() // #130
{
const char code[] = "#define MAC2STR(x) x[0],x[1],x[2],x[3],x[4],x[5]\n"
"#define FT_DEBUG(fmt, args...) if(pGlobalCtx && pGlobalCtx->debug_level>=2) printf(\"FT-dbg: \"fmt, ##args)\n"
"\n"
"FT_DEBUG(\" %02x:%02x:%02x:%02x:%02x:%02x\\n\", MAC2STR(pCtx->wlan_intf_addr[i]));\n";
ASSERT_EQUALS("\n"
"\n"
"\n"
"if ( pGlobalCtx && pGlobalCtx -> debug_level >= 2 ) printf ( \"FT-dbg: \" \" %02x:%02x:%02x:%02x:%02x:%02x\\n\" , pCtx -> wlan_intf_addr [ i ] [ 0 ] , pCtx -> wlan_intf_addr [ i ] [ 1 ] , pCtx -> wlan_intf_addr [ i ] [ 2 ] , pCtx -> wlan_intf_addr [ i ] [ 3 ] , pCtx -> wlan_intf_addr [ i ] [ 4 ] , pCtx -> wlan_intf_addr [ i ] [ 5 ] ) ;", preprocess(code));
}

static void define19() // #124
{
const char code[] = "#define CONCAT(tok) tok##suffix\n"
"\n"
"CONCAT(Test);\n"
"CONCAT(const Test);\n";
ASSERT_EQUALS("\n"
"\n"
"Testsuffix ;\n"
"const Testsuffix ;", preprocess(code));
}

static void define20() // #113
{
const char code[] = "#define TARGS4 T1,T2,T3,T4\n"
"#define FOOIMPL(T__CLASS, TARGS) void foo(const T__CLASS<TARGS>& x) { }\n"
"#define FOOIMPL_4(T__CLASS) FOOIMPL(T__CLASS, TARGS4)\n"
"FOOIMPL_4(y)\n";
ASSERT_EQUALS("\n"
"\n"
"\n"
"void foo ( const y < T1 , T2 , T3 , T4 > & x ) { }", preprocess(code));
}

static void define21() // #66
{
const char code[] = "#define GETMYID(a) ((a))+1\n"
"#define FIGHT_FOO(c, ...) foo(c, ##__VA_ARGS__)\n"
"FIGHT_FOO(1, GETMYID(a));\n";
ASSERT_EQUALS("\n"
"\n"
"foo ( 1 , ( ( a ) ) + 1 ) ;", preprocess(code));
}

static void define22() // #40
{
const char code[] = "#define COUNTER_NAME(NAME, ...) NAME##Count\n"
"#define COMMA ,\n"
"\n"
"#define DECLARE_COUNTERS(LIST) unsigned long LIST(COUNTER_NAME, COMMA);\n"
"\n"
"#define ACTUAL_LIST(FUNCTION, SEPARATOR) \\\n"
"FUNCTION(event1, int, foo) SEPARATOR \\\n"
"FUNCTION(event2, char, bar)\n"
"\n"
"DECLARE_COUNTERS(ACTUAL_LIST)\n";
ASSERT_EQUALS("\n"
"\n"
"\n"
"\n"
"\n"
"\n"
"\n"
"\n"
"\n"
"unsigned long event1Count , event2Count ;", preprocess(code));
}

static void define23() // #40
{
const char code[] = "#define COMMA ,\n"
"#define MULTI(SEPARATOR) A SEPARATOR B\n"
"\n"
"#define VARS MULTI(COMMA)\n"
"unsigned VARS;\n";
ASSERT_EQUALS("\n"
"\n"
"\n"
"\n"
"unsigned A , B ;", preprocess(code));
}


static void define_invalid_1()
Expand Down Expand Up @@ -1153,6 +1328,15 @@ static void pragma_backslash()
ASSERT_EQUALS("", preprocess(code, &outputList));
}

static void pragma_backslash_2() // #217
{
const char code[] = "#pragma comment(linker, \"foo \\\n"
"bar\")\n";

simplecpp::OutputList outputList;
ASSERT_EQUALS("", preprocess(code, &outputList));
}

static void dollar()
{
ASSERT_EQUALS("$ab", readfile("$ab"));
Expand Down Expand Up @@ -3655,6 +3839,16 @@ int main(int argc, char **argv)
TEST_CASE(define11);
TEST_CASE(define12);
TEST_CASE(define13);
TEST_CASE(define14); // #296
TEST_CASE(define15); // #231
TEST_CASE(define16); // #201
TEST_CASE(define17); // #185
TEST_CASE(define18); // #130
TEST_CASE(define19); // #124
TEST_CASE(define20); // #113
TEST_CASE(define21); // #66
TEST_CASE(define22); // #40
TEST_CASE(define23); // #40
TEST_CASE(define_invalid_1);
TEST_CASE(define_invalid_2);
TEST_CASE(define_define_1);
Expand Down Expand Up @@ -3697,6 +3891,7 @@ int main(int argc, char **argv)
TEST_CASE(define_va_opt_9); // #632

TEST_CASE(pragma_backslash); // multiline pragma directive
TEST_CASE(pragma_backslash_2); // #217

// UB: #ifdef as macro parameter
TEST_CASE(define_ifdef);
Expand Down
Loading