# This testcase is part of GDB, the GNU debugger.

# Copyright 2022 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/>.

# Compile a source file using different ways of passing the path to the
# compiler.  Then, verify that we can print a macro defined in that file.

standard_testfile

# If the host is remote, source files are uploaded to the host and compiled
# there, but without the directory structure we expect, making the test
# pointless.  Skip the test in that case.
if { [is_remote host] } {
    return
}

# Copy the source file at these locations in the output directory ($out):
#
#   $out/cwd/macro-source-path.c
#   $out/other/macro-source-path.c
#
# Set the current working directory to $out/cwd, so that we can test compiling
# using relative paths.

set out_dir [standard_output_file ""]
file mkdir $out_dir/cwd
file mkdir $out_dir/other
file copy -force $srcdir/$subdir/$srcfile $out_dir/cwd
file copy -force $srcdir/$subdir/$srcfile $out_dir/other

# Run one test.
#
# SRC is the path to the source file, to be passed to the compiler as-is.
# NAME is the name of the test.

proc test { src name } {
    with_test_prefix $name {
	set binfile $::out_dir/$name

	if { [gdb_compile $src $binfile executable {debug macros additional_flags=-DONE=1}] != "" } {
	    fail "could not compile"
	    return
	}

	clean_restart $binfile

	if { ![runto_main] } {
	    return
	}

	# Print the macro that is defined on the command-line.
	if { [test_compiler_info "clang-*"] } {
	    # This is really a clang bug, it puts the macros defined on the command
	    # line after the main source file, in the macro table.
	    setup_kfail "gdb/29034" "*-*-*"
	}
	gdb_test "print ONE" " = 1"

	# Print the macro that is defined in the main file.
	gdb_test "print TWO" " = 2"
    }
}

# When adding a test here, please consider adding an equivalent case to the test
# of the same name in gdb.dwarf2.

with_cwd "$out_dir/cwd" {
    test $testfile.c filename
    test ./$testfile.c dot-filename
    test ../cwd/$testfile.c dot-dot-filename
    test [file normalize $testfile.c] absolute-cwd
    test ../other/$testfile.c dot-dot-other
    test [file normalize ../other/$testfile.c] absolute-other
}
