diff options
Diffstat (limited to 'gdb/testsuite/gdb.cp')
-rw-r--r-- | gdb/testsuite/gdb.cp/align.exp | 174 |
1 files changed, 174 insertions, 0 deletions
diff --git a/gdb/testsuite/gdb.cp/align.exp b/gdb/testsuite/gdb.cp/align.exp new file mode 100644 index 0000000..7d5955e --- /dev/null +++ b/gdb/testsuite/gdb.cp/align.exp @@ -0,0 +1,174 @@ +# Copyright 2018 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/>. + +# This file is part of the gdb testsuite + +# This tests that C++ alignof works in gdb, and that it agrees with +# the compiler. + +if {[skip_cplus_tests]} { continue } + +# The types we're going to test. + +set typelist { + char {unsigned char} + short {unsigned short} + int {unsigned int} + long {unsigned long} + {long long} {unsigned long long} + float + double {long double} + empty + bigenum + vstruct + bfstruct + arrstruct + derived + derived2 +} + +if {[has_int128_cxx]} { + # Note we don't check "unsigned __int128" yet because at least gcc + # canonicalizes the name to "__int128 unsigned", and there isn't a + # c-exp.y production for this. + # https://sourceware.org/bugzilla/show_bug.cgi?id=20991 + lappend typelist __int128 +} + +# Create the test file. + +set filename [standard_output_file align.cc] +set outfile [open $filename w] + +# Prologue. +puts $outfile { + template<typename T, typename U> + struct align_pair + { + T one; + U two; + }; + + template<typename T, typename U> + struct align_union + { + T one; + U two; + }; + + enum bigenum { VALUE = 0xffffffffull }; + + struct empty { }; + + struct vstruct { virtual ~vstruct() {} char c; }; + + struct bfstruct { unsigned b : 3; }; + + struct arrstruct { short fld[7]; }; + + unsigned a_int3 = alignof (int[3]); + + unsigned a_void = alignof (void); + + struct base { char c; }; + struct derived : public virtual base { int i; }; + + struct b2 : public virtual base { char d; }; + struct derived2 : public b2, derived { char e; }; +} + +# First emit single items. +foreach type $typelist { + set utype [join [split $type] _] + puts $outfile "$type item_$utype;" + puts $outfile "unsigned a_$utype\n = alignof ($type);" + puts $outfile "typedef $type t_$utype;" + puts $outfile "t_$utype item_t_$utype;" +} + +# Now emit all pairs. +foreach type $typelist { + set utype [join [split $type] _] + foreach inner $typelist { + set uinner [join [split $inner] _] + puts $outfile "align_pair<$type, $inner> item_${utype}_x_${uinner};" + puts $outfile "unsigned a_${utype}_x_${uinner}" + puts $outfile " = alignof (align_pair<$type, $inner>);" + + puts $outfile "align_union<$type, $inner> item_${utype}_u_${uinner};" + puts $outfile "unsigned a_${utype}_u_${uinner}" + puts $outfile " = alignof (align_union<$type, $inner>);" + } +} + +# Epilogue. +puts $outfile { + int main() { + return 0; + } +} + +close $outfile + +standard_testfile $filename + +if {[prepare_for_testing "failed to prepare" $testfile $srcfile \ + {debug nowarnings c++ additional_flags=-std=c++11}]} { + return -1 +} + +if {![runto_main]} { + perror "test suppressed" + return +} + +proc maybe_xfail {type} { + # See https://gcc.gnu.org/bugzilla/show_bug.cgi?id=69560 + # The g++ implementation of alignof is changing to match C11. + if {[is_x86_like_target] + && [test_compiler_info {gcc-[0-8]-*}] + && ($type == "double" || $type == "long long" + || $type == "unsigned long long")} { + setup_xfail *-*-* + } +} + +foreach type $typelist { + set utype [join [split $type] _] + set expected [get_integer_valueof a_$utype 0] + + maybe_xfail $type + gdb_test "print alignof($type)" " = $expected" + + maybe_xfail $type + gdb_test "print alignof(t_$utype)" " = $expected" + + maybe_xfail $type + gdb_test "print alignof(typeof(item_$utype))" " = $expected" + + foreach inner $typelist { + set uinner [join [split $inner] _] + set expected [get_integer_valueof a_${utype}_x_${uinner} 0] + gdb_test "print alignof(align_pair<${type},${inner}>)" " = $expected" + + set expected [get_integer_valueof a_${utype}_u_${uinner} 0] + gdb_test "print alignof(align_union<${type},${inner}>)" " = $expected" + } +} + +set expected [get_integer_valueof a_int3 0] +gdb_test "print alignof(int\[3\])" " = $expected" +set expected [get_integer_valueof a_void 0] +gdb_test "print alignof(void)" " = $expected" |