diff options
Diffstat (limited to 'tests/t0051-dump-macro-origin.sh')
| -rwxr-xr-x | tests/t0051-dump-macro-origin.sh | 63 |
1 files changed, 63 insertions, 0 deletions
diff --git a/tests/t0051-dump-macro-origin.sh b/tests/t0051-dump-macro-origin.sh new file mode 100755 index 0000000..1a2c504 --- /dev/null +++ b/tests/t0051-dump-macro-origin.sh @@ -0,0 +1,63 @@ +#!/bin/sh +set -eu +base="${TMPDIR-/tmp}/mcpu-cpp-dump-origin-$$" +mkdir -p "$base" +trap 'rm -rf "$base"' EXIT HUP INT TERM + +cat > "$base/main.c" <<'EOT' +#define Z_USER 62 +#define A_USER 37 +#define ФУНКЦИЯ(x) x + 1 +#undef __MCPU_CPP_VERSION__ +EOT + +# -dM contains only ordinary final-state macros. Source and command-line +# definitions are ordinary; built-ins are not. +"$MCPU_CPP" --no-config -dM -DCMD_USER=91 "$base/main.c" > "$base/dM" +grep -Fx '#define A_USER 37' "$base/dM" >/dev/null +grep -Fx '#define CMD_USER 91' "$base/dM" >/dev/null +grep -Fx '#define Z_USER 62' "$base/dM" >/dev/null +grep -Fx '#define ФУНКЦИЯ(x) x + 1' "$base/dM" >/dev/null +if grep '^#define _ARCH_MCPU ' "$base/dM" >/dev/null; then exit 1; fi +if grep '^#define __MCPU_' "$base/dM" >/dev/null; then exit 1; fi +LC_ALL=C sort -c "$base/dM" + +# Empty input has no ordinary definitions. +"$MCPU_CPP" --no-config -dM < /dev/null > "$base/empty-dM" +test ! -s "$base/empty-dM" + +# -dMP contains predefined macros first and ordinary macros second. Both +# groups are deterministic and the #undef above removes the version builtin. +"$MCPU_CPP" --no-config -dMP -DCMD_USER=91 "$base/main.c" > "$base/dMP" +grep -Fx '#define _ARCH_MCPU 1' "$base/dMP" >/dev/null +grep -Fx '#define A_USER 37' "$base/dMP" >/dev/null +grep -Fx '#define CMD_USER 91' "$base/dMP" >/dev/null +grep -Fx '#define Z_USER 62' "$base/dMP" >/dev/null +grep -Fx '#define ФУНКЦИЯ(x) x + 1' "$base/dMP" >/dev/null +if grep '^#define __MCPU_CPP_VERSION__ ' "$base/dMP" >/dev/null; then exit 1; fi + +predefined_line=`grep -n '^#define _ARCH_MCPU 1$' "$base/dMP" | sed 's/:.*//'` +ordinary_line=`grep -n '^#define A_USER 37$' "$base/dMP" | sed 's/:.*//'` +test "$predefined_line" -lt "$ordinary_line" + +# Verify ordering inside the ordinary tail explicitly. +tail -n +"$ordinary_line" "$base/dMP" > "$base/ordinary-tail" +LC_ALL=C sort -c "$base/ordinary-tail" + +# A former builtin name, if explicitly redefined after #undef, is an ordinary +# macro because origin follows the current definition rather than the spelling. +cat > "$base/redefine.c" <<'EOT' +#undef _ARCH_MCPU +#define _ARCH_MCPU 777 +#define LOCAL 1 +EOT +"$MCPU_CPP" --no-config -dM "$base/redefine.c" > "$base/redefine-dM" +grep -Fx '#define _ARCH_MCPU 777' "$base/redefine-dM" >/dev/null +"$MCPU_CPP" --no-config -dMP "$base/redefine.c" > "$base/redefine-dMP" +grep -Fx '#define _ARCH_MCPU 777' "$base/redefine-dMP" >/dev/null +test "`grep -c '^#define _ARCH_MCPU ' "$base/redefine-dMP"`" -eq 1 + +# Context-dependent special builtins remain outside the static dump. +for name in __FILE__ __LINE__ __DATE__ __TIME__ __BASE_FILE__ __INCLUDE_LEVEL__; do + if grep "^#define ${name}\\>" "$base/dMP" >/dev/null; then exit 1; fi +done |
