# Test macro scoping.
# Copyright 2002, 2007, 2008, 2009 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/>.

if $tracelevel then {
    strace $tracelevel
}

set prms_id 0
set bug_id 0

set srcfile macscp1.c
set testfile "macscp"
set objfile ${objdir}/${subdir}/${testfile}.o
set binfile ${objdir}/${subdir}/${testfile}

set options { debug additional_flags=-DFROM_COMMANDLINE=ARG}

get_compiler_info ${binfile}
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 macscp.exp
    return -1
}

gdb_exit
gdb_start
gdb_reinitialize_dir $srcdir/$subdir
gdb_load ${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'"]
}


if {[list_and_check_macro main WHERE {macscp1.c {before macscp1_3}}]} {
    global verbose
    set macro_support "unknown"
    send_gdb "info source\n"
    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 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"


# 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 "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;" "next to definition 1"

gdb_test "print MACRO_TO_EXPAND" \
    " = 0" \
    "print expression with macro in scope."

gdb_test "macro define MACRO_TO_EXPAND 72" \
  "" \
  "user macro override"

gdb_test "print MACRO_TO_EXPAND" \
  " = 72" \
  "choose user macro"

gdb_test "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 "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 "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 "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"

# Completion tests.

# 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 "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 "macro define robotinvasion 2010" \
  "" \
  "define splice helper"

gdb_test "macro expand SPLICE(robot, invasion)" \
  "expands to: *2010" \
  "splicing plus expansion"

# Varargs tests.

gdb_test "macro define va_c99(...) varfunc (fixedarg, __VA_ARGS__)" \
  "" \
  "define first varargs helper"

gdb_test "macro define va2_c99(x, y, ...) varfunc (fixedarg, x, y, __VA_ARGS__)" \
  "" \
  "define second varargs helper"

gdb_test "macro define va_gnu(args...) varfunc (fixedarg, args)" \
  "" \
  "define third varargs helper"

gdb_test "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 "macro define str(x) #x" \
  "" \
  "define stringification macro"

gdb_test "macro define maude 5" \
  "" \
  "define first stringification helper"

gdb_test "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 "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"
