# Test macro scoping.
# Copyright 2002, 2007, 2008, 2009, 2010 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'"]
}

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"


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