# Copyright 2013-2021 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

# Fission doesn't support macros yet.  Bug 15954.
if [using_fission] {
    unsupported "fission"
    return -1
}

if [is_remote host] {
    unsupported "compiling on a remote host does not support a filename with directory."
    return 0
}

set opts {debug additional_flags=-I.}

get_compiler_info
if [test_compiler_info gcc*] {
    lappend opts additional_flags=-g3
} elseif [test_compiler_info clang*] {
    lappend opts additional_flags=-fdebug-macro
}

if { [file pathtype $objdir] == "relative" } {
    untested "objdir $objdir should be absolute"
    return
}
set saved_pwd [pwd]
cd $srcdir/${subdir}/base/two
set err [gdb_compile "../../${srcfile}" "${binfile}" executable $opts]
cd $saved_pwd
if { $err != "" } {
    untested "compilation failed"
    return -1
}

clean_restart ${testfile}

# Test macros respect DW_AT_comp_dir.

# "list header_two_func" does not set exactly the one line we want.
if ![runto header_two_func] {
    return -1
}

gdb_test "info macro HEADER" "\r\n#define HEADER 2"
