Commit d2c1325a by Neil Booth Committed by Neil Booth

macro1.c: Add more macro expansion tests.

	* gcc.dg/cpp/macro1.c: Add more macro expansion tests.
	* gcc.dg/cpp/strify2.c: Same.

From-SVN: r34867
parent 0a336522
2000-07-04 Neil Booth <NeilB@earthling.net>
* gcc.dg/cpp/macro1.c: Add more macro expansion tests.
* gcc.dg/cpp/strify2.c: Same.
2000-07-03 Zack Weinberg <zack@wolery.cumb.org> 2000-07-03 Zack Weinberg <zack@wolery.cumb.org>
* testsuite/gcc.dg/cpp/19951025-1.c: Adjust regexps. * testsuite/gcc.dg/cpp/19951025-1.c: Adjust regexps.
......
...@@ -2,21 +2,26 @@ ...@@ -2,21 +2,26 @@
/* { dg-do run } */ /* { dg-do run } */
/* Tests various macros are correctly expanded. */ /* Tests various macro abuse is correctly expanded. */
extern int puts (const char *); extern int puts (const char *);
extern void abort (void); extern void abort (void);
#define err(str) do { puts(str); abort(); } while (0) extern int strcmp(const char *s1, const char *s2);
#define err(str) do { puts(str); abort(); } while (0)
#define j(x, y) x + y #define j(x, y) x + y
#define k(x, y) j(x + 2, y + #define k(x, y) j(x + 2, y +
#define glue(x, y) x ## y
#define xglue(x, y) glue(x, y)
/* Functions called when macros are left unexpanded. */
int q(int x) {return x + 40;} int q(int x) {return x + 40;}
int B(int x) {return x + 20;} int B(int x) {return x + 20;}
int foo(int x) {return x + 10;} int foo(int x) {return x + 10;}
int bar(int x, int y) {return x + y;} int bar(int x, int y) {return x + y;}
int baz(int x, int y) {return x + y;} int baz(int x, int y) {return x + y;}
int toupper(int x) {return x + 32;} int toupper(int x) {return x + 32;}
int M(int x) {return x * 2;}
int main (int argc, char *argv[]) int main (int argc, char *argv[])
{ {
...@@ -48,25 +53,76 @@ int main (int argc, char *argv[]) ...@@ -48,25 +53,76 @@ int main (int argc, char *argv[])
if (apply(bar, baz) != 42) /* foo(foo(baz(22, 0))). */ if (apply(bar, baz) != 42) /* foo(foo(baz(22, 0))). */
err ("apply bar baz"); err ("apply bar baz");
/* Taken from glibc. */
#define __tobody(c, f) f (c) #define __tobody(c, f) f (c)
#define toupper(c) __tobody (c, toupper) #define toupper(c) __tobody (c, toupper)
if (toupper (10) != 42) /* toupper (10). */ if (toupper (10) != 42) /* toupper (10). */
err ("toupper"); err ("toupper");
/* This tests that M gets expanded the right no. of times. Too many
times, and we get excess "2 +"s and the wrong sum. Derived from
nested stpcpy in dggettext.c. */
#define M(x) 2 + M(x)
#define stpcpy(a) M(a)
if (stpcpy (stpcpy (9)) != 42) /* 2 + M (2 + M (9)) */
err ("stpcpy");
/* Another test derived from nested stpcpy's of dggettext.c. Uses
macro A(x) and function B(x) as defined above. The problem was
the same - excess "1 +"s and the wrong sum. */
#define B(x) 1 + B(x)
#define C(x) A(x)
if (C(B(0)) != 42) /* 1 + B (1 + B (0)) */
err ("C");
/* More tests derived from gcc itself - the use of XEXP and COST.
These first two should both expand to the same thing. */
{
int insn = 6, i = 2, b = 2;
#define XEXP(RTX, N) (RTX * N + 2)
#define PATTERN(INSN) XEXP(INSN, 3)
if (XEXP (PATTERN (insn), i) != 42) /* ((insn * 3 + 2) * i + 2) */
err ("XEXP (PATTERN)");
if (XEXP (XEXP (insn, 3), i) != 42) /* ((insn * 3 + 2) * i + 2) */
err ("XEXP (XEXP)");
#define COST(X) XEXP (XEXP (X, 4), 4)
if (COST (b) != 42) /* ((b * 4 + 2) * 4 + 2) */
err ("COST");
}
/* This tests macro recursion and expand-after-paste. */
#define FORTYTWO "forty"
#define TWO TWO "-two"
if (strcmp (glue(FORTY, TWO), "forty"))
err ("glue");
if (strcmp (xglue(FORTY, TWO), "forty-two"))
err ("xglue");
/* Test ability to call macro over multiple logical lines. */
if (q
(42) != 42
|| q (
42) != 42
|| q (42
) != 42
|| q
(
42
)
!= 42)
err ("q over multiple lines");
/* Corner case. Test that macro expansion is turned off for later
q, when not at start but at end of argument context, and supplied
with the '(' necessary for expansion. */
if (q(1 + q)(1) != 42) /* 1 + q(1) */
err ("Nested q");
/* This looks like it has too many ')', but it hasn't. */ /* This looks like it has too many ')', but it hasn't. */
if (k(1, 4) 35) != 42) if (k(1, 4) 35) != 42)
err ("k"); err ("k");
/*#define B(x) Z B(x) /* Phew! */
#define XEXP(RTX, N) RTX->fld[N].rtx
#define PATTERN(INSN) XEXP(INSN, 3)
#define COST(X) XEXP (XEXP (x, 0), 0)
#define M(a) OK M (a)
#define stpcpy(a) M(a)
#define C(x) A(x)
XEXP (PATTERN (insn), i);
XEXP (XEXP (insn, 3), i);
COST (b)*/
return 0; return 0;
} }
...@@ -16,8 +16,9 @@ extern void abort (void); ...@@ -16,8 +16,9 @@ extern void abort (void);
int main (int argc, char *argv[]) int main (int argc, char *argv[])
{ {
str (\); /* { dg-warning "valid string" "str(\)" } */ str (\); /* { dg-warning "valid string" "str(\\)" } */
str (\\\); /* { dg-warning "valid string" "str(\\\)" } */ str (\\); /* OK. */
str (\\\); /* { dg-warning "valid string" "str(\\\\\\)" } */
/* This also serves as a useful test of the value of __INCLUDE_LEVEL. */ /* This also serves as a useful test of the value of __INCLUDE_LEVEL. */
if (strcmp (xstr (__INCLUDE_LEVEL__), "0")) if (strcmp (xstr (__INCLUDE_LEVEL__), "0"))
...@@ -26,6 +27,9 @@ int main (int argc, char *argv[]) ...@@ -26,6 +27,9 @@ int main (int argc, char *argv[])
if (strcmp(str (__INCLUDE_LEVEL__), "__INCLUDE_LEVEL__")) if (strcmp(str (__INCLUDE_LEVEL__), "__INCLUDE_LEVEL__"))
err ("macro name"); err ("macro name");
if (strcmp(str(), "") || strcmp(str( ), ""))
err ("empty string");
if (strcmp(str ("s\n"), "\"s\\n\"")) if (strcmp(str ("s\n"), "\"s\\n\""))
err ("quoted string"); err ("quoted string");
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment