# Test for printing alias symbols.
# Copyright 2017-2024 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 symbol-alias.c symbol-alias2.c
# Clang versions prior to v15 do not emit debug info for aliases.
set old_clang [expr [test_compiler_info {clang-1[0-4]-*-*}] \
		 || [test_compiler_info {clang-[1-9]-*}]]

if { [prepare_for_testing "failed to prepare" ${testfile} [list $srcfile $srcfile2]] } {
    return -1
}

if {![runto_main]} {
    return
}

# Functions.
foreach f {"func" "func_alias"} {
    gdb_test "p $f" " = {(struct )?S \\*\\(void\\)} $hex <func(\\(\\))?>"
    gdb_test "p *${f}()" "= {field1 = 1, field2 = 2}"
}

# Extern global variable.
gdb_test "p g_var_s" "= {field1 = 1, field2 = 2}"
foreach v {"g_var_s_alias" "g_var_s_alias2"} {
    gdb_test_multiple "p $v" "print alias variable $v" {
	-re -wrap " = {field1 = 1, field2 = 2}" {
	    pass $gdb_test_name
	}
	-re -wrap "has unknown type; cast it to its declared type" {
	    if { $old_clang } {
		xfail $gdb_test_name
	    } else {
		fail $gdb_test_name
	    }
	}
    }
}

# Static global variable.
gdb_test "p g_var" " = 1"
gdb_test_multiple "p g_var_alias" "print alias of static variable" {
    -re -wrap " = 1" {
	pass $gdb_test_name
    }
    -re -wrap "has unknown type; cast it to its declared type" {
	if { $old_clang } {
	  xfail $gdb_test_name
	} else {
	  fail $gdb_test_name
	}
    }
}

# Alias of a variable that is declared later in the scope.
gdb_test "p g_def_var" " = 2"
gdb_test_multiple "p g_def_var_alias" "print g_def_var_alias" {
    -re -wrap " = 2" {
	pass $gdb_test_name
    }
    -re -wrap "has unknown type; cast it to its declared type" {
	if { $old_clang } {
	  xfail $gdb_test_name
	} else {
	  fail $gdb_test_name
	}
    }
}
gdb_test_multiple "p g_def_var_alias2" "print g_def_var_alias2" {
    -re -wrap " = 2" {
	pass $gdb_test_name
    }
    -re -wrap "has unknown type; cast it to its declared type" {
	if { $old_clang } {
	  xfail $gdb_test_name
	} else {
	  fail $gdb_test_name
	}
    }
}
