Files
binutils-gdb/gdb/testsuite/gdb.base/macscp.exp
Luis Machado 84c93cd5f1 Fixup testcases outputting own name as a test name and standardize failed compilation messages
Changes in v3:

- Adjusted some testcases where the message "failed to compile" was not unique.

Changes in v2:

- Addressed comments from reviewers.
- Fixed spurious whitespaces.
- Changed compilation failure messages that included source/binary paths to
  ones that are short and deterministic.

---

Another bit of cleanup to the testsuite. We have a number of tests that are
not honoring the rule of not outputting their own name as a test name.

I fixed up all the offenders i could find with the following regular
expression:

"(xfail|kfail|kpass|fail|pass|unsupported|untested) ([A-Za-z0-9]+|\\\$(.)*testfile(.)*)\.exp$"

gdb/testsuite/ChangeLog:
2016-12-01  Luis Machado  <lgustavo@codesourcery.com>

	Fix test names and standardize compilation error messages throughout
	the following files:

	* gdb.ada/start.exp
	* gdb.arch/alpha-step.exp
	* gdb.arch/e500-prologue.exp
	* gdb.arch/ftrace-insn-reloc.exp
	* gdb.arch/gdb1291.exp
	* gdb.arch/gdb1431.exp
	* gdb.arch/gdb1558.exp
	* gdb.arch/i386-dr3-watch.exp
	* gdb.arch/i386-sse-stack-align.exp
	* gdb.arch/ia64-breakpoint-shadow.exp
	* gdb.arch/pa-nullify.exp
	* gdb.arch/powerpc-aix-prologue.exp
	* gdb.arch/thumb-bx-pc.exp
	* gdb.base/annota1.exp
	* gdb.base/annota3.exp
	* gdb.base/arrayidx.exp
	* gdb.base/assign.exp
	* gdb.base/attach.exp
	* gdb.base/auxv.exp
	* gdb.base/bang.exp
	* gdb.base/bfp-test.exp
	* gdb.base/bigcore.exp
	* gdb.base/bitfields2.exp
	* gdb.base/break-fun-addr.exp
	* gdb.base/break-probes.exp
	* gdb.base/call-rt-st.exp
	* gdb.base/callexit.exp
	* gdb.base/catch-fork-kill.exp
	* gdb.base/charset.exp
	* gdb.base/checkpoint.exp
	* gdb.base/comprdebug.exp
	* gdb.base/constvars.exp
	* gdb.base/coredump-filter.exp
	* gdb.base/cursal.exp
	* gdb.base/cvexpr.exp
	* gdb.base/detach.exp
	* gdb.base/display.exp
	* gdb.base/dmsym.exp
	* gdb.base/dprintf-pending.exp
	* gdb.base/dso2dso.exp
	* gdb.base/dtrace-probe.exp
	* gdb.base/dump.exp
	* gdb.base/enum_cond.exp
	* gdb.base/exe-lock.exp
	* gdb.base/exec-invalid-sysroot.exp
	* gdb.base/execl-update-breakpoints.exp
	* gdb.base/exprs.exp
	* gdb.base/fileio.exp
	* gdb.base/find.exp
	* gdb.base/finish.exp
	* gdb.base/fixsection.exp
	* gdb.base/foll-vfork.exp
	* gdb.base/frame-args.exp
	* gdb.base/gcore.exp
	* gdb.base/gdb1250.exp
	* gdb.base/global-var-nested-by-dso.exp
	* gdb.base/gnu-ifunc.exp
	* gdb.base/hashline1.exp
	* gdb.base/hashline2.exp
	* gdb.base/hashline3.exp
	* gdb.base/hbreak-in-shr-unsupported.exp
	* gdb.base/huge.exp
	* gdb.base/infcall-input.exp
	* gdb.base/info-fun.exp
	* gdb.base/info-shared.exp
	* gdb.base/jit-simple.exp
	* gdb.base/jit-so.exp
	* gdb.base/jit.exp
	* gdb.base/jump.exp
	* gdb.base/label.exp
	* gdb.base/lineinc.exp
	* gdb.base/logical.exp
	* gdb.base/longjmp.exp
	* gdb.base/macscp.exp
	* gdb.base/miscexprs.exp
	* gdb.base/new-ui-echo.exp
	* gdb.base/new-ui-pending-input.exp
	* gdb.base/new-ui.exp
	* gdb.base/nodebug.exp
	* gdb.base/nofield.exp
	* gdb.base/offsets.exp
	* gdb.base/overlays.exp
	* gdb.base/pending.exp
	* gdb.base/pointers.exp
	* gdb.base/pr11022.exp
	* gdb.base/printcmds.exp
	* gdb.base/prologue.exp
	* gdb.base/ptr-typedef.exp
	* gdb.base/realname-expand.exp
	* gdb.base/relativedebug.exp
	* gdb.base/relocate.exp
	* gdb.base/remote.exp
	* gdb.base/reread.exp
	* gdb.base/return2.exp
	* gdb.base/savedregs.exp
	* gdb.base/sep.exp
	* gdb.base/sepdebug.exp
	* gdb.base/sepsymtab.exp
	* gdb.base/set-inferior-tty.exp
	* gdb.base/setshow.exp
	* gdb.base/shlib-call.exp
	* gdb.base/sigaltstack.exp
	* gdb.base/siginfo-addr.exp
	* gdb.base/signals.exp
	* gdb.base/signull.exp
	* gdb.base/sigrepeat.exp
	* gdb.base/so-impl-ld.exp
	* gdb.base/solib-display.exp
	* gdb.base/solib-overlap.exp
	* gdb.base/solib-search.exp
	* gdb.base/solib-symbol.exp
	* gdb.base/structs.exp
	* gdb.base/structs2.exp
	* gdb.base/symtab-search-order.exp
	* gdb.base/twice.exp
	* gdb.base/unload.exp
	* gdb.base/varargs.exp
	* gdb.base/watchpoint-solib.exp
	* gdb.base/watchpoint.exp
	* gdb.base/whatis.exp
	* gdb.base/wrong_frame_bt_full.exp
	* gdb.btrace/dlopen.exp
	* gdb.cell/ea-standalone.exp
	* gdb.cell/ea-test.exp
	* gdb.cp/dispcxx.exp
	* gdb.cp/gdb2384.exp
	* gdb.cp/method2.exp
	* gdb.cp/nextoverthrow.exp
	* gdb.cp/pr10728.exp
	* gdb.disasm/am33.exp
	* gdb.disasm/h8300s.exp
	* gdb.disasm/mn10300.exp
	* gdb.disasm/sh3.exp
	* gdb.dwarf2/dw2-dir-file-name.exp
	* gdb.fortran/complex.exp
	* gdb.fortran/library-module.exp
	* gdb.guile/scm-pretty-print.exp
	* gdb.guile/scm-symbol.exp
	* gdb.guile/scm-type.exp
	* gdb.guile/scm-value.exp
	* gdb.linespec/linespec.exp
	* gdb.mi/gdb701.exp
	* gdb.mi/gdb792.exp
	* gdb.mi/mi-breakpoint-changed.exp
	* gdb.mi/mi-dprintf-pending.exp
	* gdb.mi/mi-dprintf.exp
	* gdb.mi/mi-exit-code.exp
	* gdb.mi/mi-pending.exp
	* gdb.mi/mi-solib.exp
	* gdb.mi/new-ui-mi-sync.exp
	* gdb.mi/pr11022.exp
	* gdb.mi/user-selected-context-sync.exp
	* gdb.opt/solib-intra-step.exp
	* gdb.python/py-events.exp
	* gdb.python/py-finish-breakpoint.exp
	* gdb.python/py-mi.exp
	* gdb.python/py-prettyprint.exp
	* gdb.python/py-shared.exp
	* gdb.python/py-symbol.exp
	* gdb.python/py-template.exp
	* gdb.python/py-type.exp
	* gdb.python/py-value.exp
	* gdb.reverse/solib-precsave.exp
	* gdb.reverse/solib-reverse.exp
	* gdb.server/solib-list.exp
	* gdb.stabs/weird.exp
	* gdb.threads/reconnect-signal.exp
	* gdb.threads/stepi-random-signal.exp
	* gdb.trace/actions.exp
	* gdb.trace/ax.exp
	* gdb.trace/backtrace.exp
	* gdb.trace/change-loc.exp
	* gdb.trace/deltrace.exp
	* gdb.trace/ftrace-lock.exp
	* gdb.trace/ftrace.exp
	* gdb.trace/infotrace.exp
	* gdb.trace/mi-tracepoint-changed.exp
	* gdb.trace/packetlen.exp
	* gdb.trace/passcount.exp
	* gdb.trace/pending.exp
	* gdb.trace/range-stepping.exp
	* gdb.trace/report.exp
	* gdb.trace/stap-trace.exp
	* gdb.trace/tfind.exp
	* gdb.trace/trace-break.exp
	* gdb.trace/trace-condition.exp
	* gdb.trace/trace-enable-disable.exp
	* gdb.trace/trace-mt.exp
	* gdb.trace/tracecmd.exp
	* gdb.trace/tspeed.exp
	* gdb.trace/tsv.exp
	* lib/perftest.exp
2016-12-01 14:47:50 -06:00

697 lines
22 KiB
Plaintext

# Test macro scoping.
# Copyright 2002-2016 Free Software Foundation, Inc.
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
standard_testfile macscp1.c
set objfile [standard_output_file ${testfile}.o]
set options { debug additional_flags=-DFROM_COMMANDLINE=ARG}
get_compiler_info
if [test_compiler_info gcc*] {
lappend options additional_flags=-g3
}
# Generate the intermediate object file. This is required by Darwin to
# have access to the .debug_macinfo section.
if {[gdb_compile "${srcdir}/${subdir}/macscp1.c" "${objfile}" \
object $options] != ""
|| [gdb_compile "${objfile}" "${binfile}" executable $options] != "" } {
untested "failed to compile"
return -1
}
clean_restart ${binfile}
# Ask GDB to show the current definition of MACRO, and return a list
# describing the result.
#
# The return value has the form {FILE1 FILE2 ... DEF}, which means
# that MACRO has the definition `DEF', and was defined in `FILE1',
# which was included from `FILE2', included from ... .
#
# If GDB says that MACRO has no definition, return the string `undefined'.
#
# If GDB complains that it doesn't have any information about
# preprocessor macro definitions, return the string `no-macro-info'.
#
# If expect times out waiting for GDB, we return the string `timeout'.
#
# If GDB's output doesn't otherwise match what we're expecting, we
# return the empty string.
proc info_macro {macro} {
global gdb_prompt
set filepat {macscp[0-9]+\.[ch]}
set definition {}
set location {}
# Line number zero is set for macros defined from the compiler command-line.
# Such macros are not being tested by this function.
set nonzero {[1-9][0-9]*}
send_gdb "info macro ${macro}\n"
set debug_me 0
if {$debug_me} {exp_internal 1}
gdb_expect {
-re "Defined at \[^\r\n\]*(${filepat}):${nonzero}\[\r\n\]" {
# `location' and `definition' should be empty when we see
# this message.
if {[llength $location] == 0 && [llength $definition] == 0} {
set location $expect_out(1,string)
exp_continue
} else {
# Exit this expect loop, with a result indicating failure.
set definition {}
}
}
-re "The symbol `${macro}' has no definition as a C/C\\+\\+ preprocessor macro\[^\r\n\]*\[\r\n\]" {
# `location' and `definition' should be empty when we see
# this message.
if {[llength $location] == 0 && [llength $definition] == 0} {
set definition undefined
exp_continue
} else {
# Exit this expect loop, with a result indicating failure.
set definition {}
}
}
-re "^\[\r\n\]* included at \[^\r\n\]*(${filepat}):${nonzero}\[\r\n\]" {
# `location' should *not* be empty when we see this
# message. It should have recorded at least the initial
# `Defined at ' message (for definitions) or ` at' message
# (for undefined symbols).
if {[llength $location] != 0} {
lappend location $expect_out(1,string)
exp_continue
} else {
# Exit this expect loop, with a result indicating failure.
set definition {}
}
}
-re "^\[\r\n\]*at \[^\r\n\]*(${filepat}):${nonzero}\[\r\n\]" {
# This appears after a `has no definition' message.
# `location' should be empty when we see it.
if {[string compare $definition undefined] == 0 \
&& [llength $location] == 0} {
set location $expect_out(1,string)
exp_continue
} else {
# Exit this expect loop, with a result indicating failure.
set definition {}
}
}
-re "#define ${macro} (\[^\r\n\]*)\[\r\n\]" {
# `definition' should be empty when we see this message.
if {[string compare $definition ""] == 0} {
set definition $expect_out(1,string)
exp_continue
} else {
# Exit this expect loop, with a result indicating failure.
set definition {}
}
}
-re "has no preprocessor macro information.*$gdb_prompt $" {
set definition no-macro-info
}
-re "$gdb_prompt $" {
# Exit the expect loop; let the existing value of `definition'
# indicate failure or success.
}
timeout {
set definition timeout
}
}
if {$debug_me} {exp_internal 0}
switch -exact -- $definition {
no-macro-info { return no-macro-info }
timeout { return timeout }
undefined { return undefined }
default {
if {[llength $location] >= 1} {
return [concat $location [list $definition]]
} else {
return {}
}
}
}
}
# Call info_macro to show the definition of MACRO. Expect a result of
# EXPECTED. Use WHERE in pass/fail messages to identify the context.
# Return non-zero if we should abort the entire test file, or zero if
# we can continue.
proc check_macro {macro expected where} {
set func_def [info_macro $macro]
if {[string compare $func_def $expected] == 0} {
pass "info macro $macro $where"
} else {
switch -exact -- $func_def {
no-macro-info {
xfail "executable includes no macro debugging information"
return 1
}
undefined {
fail "info macro $macro $where (undefined)"
return 1
}
timeout {
fail "info macro $macro $where (timeout)"
}
default {
fail "info macro $macro $where"
}
}
}
return 0
}
# List the function FUNC, and then show the definition of MACRO,
# expecting the result EXPECTED.
proc list_and_check_macro {func macro expected} {
gdb_test "list $func" ".*${func}.*" "list $func for $macro"
return [check_macro $macro $expected "after `list $func'"]
}
gdb_test "list main" ".*main.*" "list main for support check"
set macro_support "unknown"
gdb_test_multiple "info source" "test macro information" {
-re "Includes preprocessor macro info\..*$gdb_prompt $" {
set macro_support 1
verbose "Source has macro information"
}
-re "Does not include preprocessor macro info\..*$gdb_prompt $" {
set macro_support 0
verbose "Source has no macro information"
}
default {
warning "couldn't check macro support (no valid response)."
}
}
if {$macro_support == 0} {
unsupported "skipping test because debug information does not include macro information."
return 0
}
list_and_check_macro main WHERE {macscp1.c {before macscp1_3}}
list_and_check_macro macscp2_2 WHERE {macscp2.h macscp1.c {before macscp2_2}}
list_and_check_macro macscp3_2 WHERE {macscp3.h macscp1.c {before macscp3_2}}
# Assuming the current position inside program by `list' from above.
gdb_test "info macro FROM_COMMANDLINE" \
"Defined at \[^\r\n\]*:0\r\n-DFROM_COMMANDLINE=ARG"
gdb_test "info macro __FILE__" "#define __FILE__ \".*macscp3.h\"" \
"info macro __FILE__ before running"
gdb_test "info macro __LINE__" "#define __LINE__ 26" \
"info macro __LINE__ before running"
# Although GDB's macro table structures distinguish between multiple
# #inclusions of the same file, GDB's other structures don't. So the
# `list' command here doesn't reliably select one #inclusion or the
# other, even though it could. It would be nice to eventually change
# GDB's structures to handle this correctly.
gdb_test "list macscp4_2_from_macscp2" ".*macscp4_2_, MACSCP4_INCLUSION.*"
switch -exact -- [info_macro WHERE] {
{macscp4.h macscp2.h macscp1.c {before macscp4_2_..., from macscp2.h}} {
pass "info macro WHERE after `list macscp_4_2_from_macscp2'"
}
{macscp4.h macscp3.h macscp1.c {before macscp4_2_..., from macscp3.h}} {
setup_kfail "gdb/555" *-*-*
fail "info macro WHERE after `list macscp_4_2_from_macscp2' (gdb/555)"
}
timeout {
fail "info macro WHERE after `list macscp_4_2_from_macscp2' (timeout)"
}
default { fail "info macro WHERE after `list macscp_4_2_from_macscp2'" }
}
gdb_test "list macscp4_2_from_macscp3" ".*macscp4_2_, MACSCP4_INCLUSION.*"
switch -exact -- [info_macro WHERE] {
{macscp4.h macscp3.h macscp1.c {before macscp4_2_..., from macscp3.h}} {
pass "info macro WHERE after `list macscp_4_2_from_macscp3'"
}
{macscp4.h macscp2.h macscp1.c {before macscp4_2_..., from macscp2.h}} {
setup_kfail "gdb/555" *-*-*
fail "info macro WHERE after `list macscp_4_2_from_macscp3' (gdb/555)"
}
timeout {
fail "info macro WHERE after `list macscp_4_2_from_macscp3' (timeout)"
}
default { fail "info macro WHERE after `list macscp_4_2_from_macscp3'" }
}
#### Test the selection of the macro scope by the current frame.
### A table of functions, in the order they will be reached, which is
### also the order they appear in the preprocessed output. Each entry
### has the form {FUNCNAME WHERE KFAILWHERE}, where:
### - FUNCNAME is the name of the function,
### - WHERE is the definition we expect to see for the macro `WHERE', as
### returned by `info_macro', and
### - KFAILWHERE is an alternate definition which should be reported
### as a `known failure', due to GDB's inability to distinguish multiple
### #inclusions of the same file.
### KFAILWHERE may be omitted.
set funcs {
{
macscp1_1
{macscp1.c {before macscp1_1}}
}
{
macscp2_1
{macscp2.h macscp1.c {before macscp2_1}}
}
{
macscp4_1_from_macscp2
{macscp4.h macscp2.h macscp1.c {before macscp4_1_..., from macscp2.h}}
{macscp4.h macscp3.h macscp1.c {before macscp4_1_..., from macscp3.h}}
}
{
macscp4_2_from_macscp2
{macscp4.h macscp2.h macscp1.c {before macscp4_2_..., from macscp2.h}}
{macscp4.h macscp3.h macscp1.c {before macscp4_2_..., from macscp3.h}}
}
{
macscp2_2
{macscp2.h macscp1.c {before macscp2_2}}
}
{
macscp1_2
{macscp1.c {before macscp1_2}}
}
{
macscp3_1
{macscp3.h macscp1.c {before macscp3_1}}
}
{
macscp4_1_from_macscp3
{macscp4.h macscp3.h macscp1.c {before macscp4_1_..., from macscp3.h}}
{macscp4.h macscp2.h macscp1.c {before macscp4_1_..., from macscp2.h}}
}
{
macscp4_2_from_macscp3
{macscp4.h macscp3.h macscp1.c {before macscp4_2_..., from macscp3.h}}
{macscp4.h macscp2.h macscp1.c {before macscp4_2_..., from macscp2.h}}
}
{
macscp3_2
{macscp3.h macscp1.c {before macscp3_2}}
}
{
macscp1_3
{macscp1.c {before macscp1_3}}
}
}
proc maybe_kfail { func test_name } {
# We can't get the right scope info when we're stopped in
# the macro4_ functions.
if {[string match macscp4_* $func]} {
kfail gdb/555 "$test_name"
} else {
fail "$test_name"
}
}
# Start the program running.
if {! [runto_main]} {
fail "macro tests suppressed: couldn't run to main"
return 0
}
# Set a breakpoint on each of the functions.
foreach func_entry $funcs {
set func [lindex $func_entry 0]
gdb_test "break $func" "Breakpoint.*"
}
# Run to each of the breakpoints and check the definition (or lack
# thereof) of each macro.
for {set i 0} {$i < [llength $funcs]} {incr i} {
set func_entry [lindex $funcs $i]
set func [lindex $func_entry 0]
set expected [lindex $func_entry 1]
set kfail_expected [lindex $func_entry 2]
# Run to the breakpoint for $func.
gdb_test "continue" "Breakpoint $decimal, $func .*" "continue to $func"
# Check the macro WHERE.
set result [info_macro WHERE]
if {[string compare $result $expected] == 0} {
pass "info macro WHERE stopped in $func"
} elseif {[string compare $result $kfail_expected] == 0} {
setup_kfail "gdb/555" *-*-*
fail "info macro WHERE stopped in $func (gdb/555)"
} elseif {[string compare $result timeout] == 0} {
fail "info macro WHERE stopped in $func (timeout)"
} else {
fail "info macro WHERE stopped in $func"
}
# Check that the BEFORE_<func> macros for all prior functions are
# #defined, and that those for all subsequent functions are not.
for {set j 0} {$j < [llength $funcs]} {incr j} {
if {$j != $i} {
set func_j_entry [lindex $funcs $j]
set func_j [lindex $func_j_entry 0]
set before_macro "BEFORE_[string toupper $func_j]"
set test_name \
"$before_macro defined/undefined when stopped at $func"
set result [info_macro $before_macro]
if {$j < $i} {
if {[llength $result] >= 2 && \
[string compare [lindex $result end] {}] == 0} {
pass $test_name
} elseif {[string compare $result timeout] == 0} {
fail "$test_name (timeout)"
} else {
maybe_kfail $func "$test_name"
}
} elseif {$j > $i} {
switch -- [lindex $result end] {
undefined { pass $test_name }
timeout { fail "$test_name (timeout)" }
default {
maybe_kfail $func "$test_name"
}
}
}
set until_macro "UNTIL_[string toupper $func_j]"
set test_name \
"$until_macro defined/undefined when stopped at $func"
set result [info_macro $until_macro]
if {$j <= $i} {
switch -- [lindex $result end] {
undefined { pass $test_name }
timeout { fail "$test_name (timeout)" }
default {
maybe_kfail $func "$test_name"
}
}
} elseif {$j > $i} {
if {[llength $result] >= 2 && \
[string compare [lindex $result end] {}] == 0} {
pass $test_name
} elseif {[string compare $result timeout] == 0} {
fail "$test_name (timeout)"
} else {
maybe_kfail $func "$test_name"
}
}
}
}
}
gdb_test "break [gdb_get_line_number "set breakpoint here"]" \
"Breakpoint.*at.* file .*, line.*" \
"breakpoint macscp_expr"
gdb_test "cond \$bpnum foo == MACRO_TO_EXPAND" \
"No symbol \"MACRO_TO_EXPAND\" in current context\." \
"macro MACRO_TO_EXPAND not in scope at breakpoint"
# Note that we choose the condition so that this breakpoint never
# stops.
set l2 [gdb_get_line_number "set second breakpoint here"]
gdb_test "break $l2 if foo != MACRO_TO_EXPAND" \
"Breakpoint.*at.*" \
"breakpoint macscp_expr using MACRO_TO_EXPAND"
gdb_test "continue" "foo = 0;.*" "continue to macsp_expr"
gdb_test "print address.addr" \
" = 0" \
"print address.addr"
gdb_test "print MACRO_TO_EXPAND" \
"No symbol \"MACRO_TO_EXPAND\" in current context\." \
"print expression with macro before define."
gdb_test "next" "foo = 1;.*here.*/" "next to definition 1"
gdb_test "print MACRO_TO_EXPAND" \
" = 0" \
"print expression with macro in scope."
gdb_test_no_output "macro define MACRO_TO_EXPAND 72" \
"user macro override"
gdb_test "print MACRO_TO_EXPAND" \
" = 72" \
"choose user macro"
gdb_test_no_output "macro undef MACRO_TO_EXPAND" \
"remove user override"
gdb_test "print MACRO_TO_EXPAND" \
" = 0" \
"print expression with macro after removing override"
gdb_test "next" "foo = 2;.*" "next to definition 2"
gdb_test "print MACRO_TO_EXPAND" \
"No symbol \"MACRO_TO_EXPAND\" in current context\." \
"print expression with macro after undef."
gdb_test_no_output "macro define MACRO_TO_EXPAND 5" \
"basic macro define"
gdb_test "print MACRO_TO_EXPAND" \
" = 5" \
"expansion of defined macro"
gdb_test "macro list" \
"macro define MACRO_TO_EXPAND 5" \
"basic macro list"
gdb_test_no_output "macro define MACRO_TO_EXPAND(x) x" \
"basic redefine, macro with args"
gdb_test "print MACRO_TO_EXPAND (7)" \
" = 7" \
"expansion of macro with arguments"
gdb_test_no_output "macro undef MACRO_TO_EXPAND" \
"basic macro undef"
gdb_test "print MACRO_TO_EXPAND" \
"No symbol \"MACRO_TO_EXPAND\" in current context\." \
"print expression with macro after user undef."
# Regression test; this used to crash.
gdb_test "macro define" \
"usage: macro define.*" \
"macro define with no arguments"
# Regression test; this used to crash.
gdb_test "macro undef" \
"usage: macro undef.*" \
"macro undef with no arguments"
# Do completion tests if readline is used.
if { [readline_is_used] } {
# The macro FIFTY_SEVEN is in scope at this point.
send_gdb "p FIFTY_\t"
gdb_expect {
-re "^p FIFTY_SEVEN $" {
send_gdb "\n"
gdb_expect {
-re "^.* = 57.*$gdb_prompt $" {
pass "complete 'p FIFTY_SEVEN'"
}
-re ".*$gdb_prompt $" { fail "complete 'p FIFTY_SEVEN'" }
timeout { fail "(timeout) complete 'p FIFTY_SEVEN'" }
}
}
-re ".*$gdb_prompt $" { fail "complete 'p FIFTY_SEVEN'" }
timeout { fail "(timeout) complete 'p FIFTY_SEVEN' 2" }
}
# The macro TWENTY_THREE is not in scope.
send_gdb "p TWENTY_\t"
gdb_expect {
-re "^p TWENTY_\\\x07$" {
send_gdb "\n"
gdb_expect {
-re "No symbol \"TWENTY_\" in current context\\..*$gdb_prompt $" {
pass "complete 'p TWENTY_'"
}
-re ".*$gdb_prompt $" { fail "complete 'p TWENTY_'" }
timeout { fail "(timeout) complete 'p TWENTY_'"}
}
}
-re ".*$gdb_prompt $" { fail "complete 'p TWENTY_'" }
timeout { fail "(timeout) complete 'p TWENTY_' 2" }
}
# The macro FORTY_EIGHT was undefined and thus is not in scope.
send_gdb "p FORTY_\t"
gdb_expect {
-re "^p FORTY_\\\x07$" {
send_gdb "\n"
gdb_expect {
-re "No symbol \"FORTY_\" in current context\\..*$gdb_prompt $" {
pass "complete 'p FORTY_'"
}
-re ".*$gdb_prompt $" { fail "complete 'p FORTY_'" }
timeout {fail "(timeout) complete 'p FORTY_'"}
}
}
-re ".*$gdb_prompt $" { fail "complete 'p FORTY_'" }
timeout { fail "(timeout) complete 'p FORTY_' 2" }
}
gdb_test_no_output "macro define TWENTY_THREE 25" \
"defining TWENTY_THREE"
# User-defined macros are always in scope.
send_gdb "p TWENTY_\t"
gdb_expect {
-re "^p TWENTY_THREE $" {
send_gdb "\n"
gdb_expect {
-re "^.* = 25.*$gdb_prompt $" {
pass "complete 'p TWENTY_THREE'"
}
-re ".*$gdb_prompt $" { fail "complete 'p TWENTY_THREE'"}
timeout { fail "(timeout) complete 'p TWENTY_THREE'" }
}
}
-re ".*$gdb_prompt $" { fail "complete 'p TWENTY_THREE'" }
timeout { fail "(timeout) complete 'p TWENTY_THREE' 2" }
}
}
# Splicing tests.
gdb_test "macro expand SPLICE(x, y)" \
"expands to: xy" \
"basic macro splicing"
gdb_test_no_output "macro define robotinvasion 2010" \
"define splice helper"
gdb_test "macro expand SPLICE(robot, invasion)" \
"expands to: *2010" \
"splicing plus expansion"
# Varargs tests.
gdb_test_no_output "macro define va_c99(...) varfunc (fixedarg, __VA_ARGS__)" \
"define first varargs helper"
gdb_test_no_output "macro define va2_c99(x, y, ...) varfunc (fixedarg, x, y, __VA_ARGS__)" \
"define second varargs helper"
gdb_test_no_output "macro define va_gnu(args...) varfunc (fixedarg, args)" \
"define third varargs helper"
gdb_test_no_output "macro define va2_gnu(args...) varfunc (fixedarg, ## args)" \
"define fourth varargs helper"
gdb_test "macro expand va_c99(one, two, three)" \
"expands to: *varfunc \\(fixedarg, *one, two, three\\)" \
"c99 varargs expansion"
gdb_test "macro expand va_c99()" \
"expands to: *varfunc \\(fixedarg, *\\)" \
"c99 varargs expansion without an argument"
gdb_test "macro expand va2_c99(one, two, three, four)" \
"expands to: *varfunc \\(fixedarg, *one, two, three, four\\)" \
"c99 varargs expansion, multiple formal arguments"
gdb_test "macro expand va_gnu(one, two, three, four)" \
"expands to: *varfunc \\(fixedarg, *one, two, three, four\\)" \
"gnu varargs expansion"
gdb_test "macro expand va_gnu()" \
"expands to: *varfunc \\(fixedarg, *\\)" \
"gnu varargs expansion without an argument"
gdb_test "macro expand va2_gnu()" \
"expands to: *varfunc \\(fixedarg\\)" \
"gnu varargs expansion special splicing without an argument"
# Stringification tests.
gdb_test_no_output "macro define str(x) #x" \
"define stringification macro"
gdb_test_no_output "macro define maude 5" \
"define first stringification helper"
gdb_test_no_output "macro define xstr(x) str(x)" \
"define second stringification helper"
gdb_test "print str(5)" \
" = \"5\"" \
"simple stringify"
gdb_test "print str(hi bob)" \
" = \"hi bob\"" \
"stringify with one space"
gdb_test "print str( hi bob )" \
" = \"hi bob\"" \
"stringify with many spaces"
gdb_test "print str(hi \"bob\")" \
" = \"hi \\\\\"bob\\\\\"\"" \
"stringify with quotes"
gdb_test "print str(hi \\bob\\)" \
" = \"hi \\\\\\\\bob\\\\\\\\\"" \
"stringify with backslashes"
gdb_test "print str(maude)" \
" = \"maude\"" \
"stringify without substitution"
gdb_test "print xstr(maude)" \
" = \"5\"" \
"stringify with substitution"
# Regression test for pp-number bug.
gdb_test_no_output "macro define si_addr fields.fault.si_addr" \
"define si_addr macro"
gdb_test "macro expand siginfo.si_addr" \
"expands to: siginfo.fields.fault.si_addr" \
"macro expand siginfo.si_addr"
gdb_test "print __FILE__" " = \".*macscp1.c\""
gdb_test "print __LINE__" \
" = [gdb_get_line_number {stopping point for line test}]"