summaryrefslogtreecommitdiff
path: root/tests/t0051-dump-macro-origin.sh
blob: 1a2c504c7c4fe39984d5ed381d71b837c1f9fbb4 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
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