summaryrefslogtreecommitdiff
path: root/tests/t0051-dump-macro-origin.sh
diff options
context:
space:
mode:
Diffstat (limited to 'tests/t0051-dump-macro-origin.sh')
-rwxr-xr-xtests/t0051-dump-macro-origin.sh63
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