From 7e745333bb11ea83680dce93c3b699bfcc11c3f4 Mon Sep 17 00:00:00 2001 From: David Taylor Date: Fri, 8 Jan 1999 23:40:55 +0000 Subject: [PATCH] new files -- part of HP merge. --- gdb/testsuite/gdb.base/.Sanitize | 33 +- gdb/testsuite/gdb.base/call-rt-st.c | 530 ++++++++++ gdb/testsuite/gdb.base/callfuncs2.exp | 276 +++++ gdb/testsuite/gdb.base/constvars.exp | 963 ++++++++++++++++++ .../gdb.base/{environment.exp => environ.exp} | 0 gdb/testsuite/gdb.base/smoke.cc | 480 +++++++++ 6 files changed, 2272 insertions(+), 10 deletions(-) create mode 100644 gdb/testsuite/gdb.base/call-rt-st.c create mode 100644 gdb/testsuite/gdb.base/callfuncs2.exp create mode 100644 gdb/testsuite/gdb.base/constvars.exp rename gdb/testsuite/gdb.base/{environment.exp => environ.exp} (100%) create mode 100644 gdb/testsuite/gdb.base/smoke.cc diff --git a/gdb/testsuite/gdb.base/.Sanitize b/gdb/testsuite/gdb.base/.Sanitize index a516963a14..6e948075c4 100644 --- a/gdb/testsuite/gdb.base/.Sanitize +++ b/gdb/testsuite/gdb.base/.Sanitize @@ -42,9 +42,13 @@ break.exp callfuncs.c callfuncs.exp callfuncs2.c -call-array-struct.c -call-return-struct.c -call-strings.c +callfuncs2.exp +call-ar-st.c +call-ar-st.exp +call-rt-st.c +call-rt-st.exp +call-strs.c +call-strs.exp commands.exp compiler.c completion.exp @@ -54,6 +58,7 @@ condbreak.exp configure configure.in constvars.c +constvars.exp corefile.exp coremaker.c crossload.exp @@ -64,9 +69,10 @@ define.exp display.c dollar.exp echo.exp -enable-disable-break.exp +ena-dis-br.exp ending-run.c -environment.exp +ending-run.exp +environ.exp eval-skip.exp exprs.c exprs.exp @@ -105,6 +111,7 @@ mips-ecoff.u mips_pro.c mips_pro.exp miscexprs.c +miscexprs.exp nodebug.c nodebug.exp opaque.exp @@ -138,12 +145,12 @@ run.c scope.exp scope0.c scope1.c -section_command.exp +sect-cmd.exp setshow.c setshow.exp setvar.c setvar.exp -shlib-call2.exp +shlib-cl2.exp shmain.c shr1.c shr2.c @@ -152,11 +159,15 @@ sigall.exp signals.c signals.exp smoke.c +smoke.cc +smoke.exp solib.c solib1.c solib2.c -solib_implicitly_loaded.c -solib_indirect_call.c +so-impl-ld.c +so-impl-ld.exp +so-indr-cl.c +so-indr-cl.exp sparc-aout.u sparc-elf.u ss.h @@ -167,11 +178,13 @@ term.exp twice.c twice.exp varargs.c +varargs.exp +volatile.exp watchpoint.c watchpoint.exp whatis.c whatis.exp -whatis-expr.exp +whatis-exp.exp Things-to-lose: structs.c diff --git a/gdb/testsuite/gdb.base/call-rt-st.c b/gdb/testsuite/gdb.base/call-rt-st.c new file mode 100644 index 0000000000..c89cb11f51 --- /dev/null +++ b/gdb/testsuite/gdb.base/call-rt-st.c @@ -0,0 +1,530 @@ +#include +#include +#include + +/************************************************************************** + * TESTS : + * function returning large structures, which go on the stack + * functions returning varied sized structs which go on in the registers. + ***************************************************************************/ + + +/* A large structure (> 64 bits) used to test passing large structures as + * parameters + */ + +struct array_rep_info_t { + int next_index[10]; + int values[10]; + int head; +}; + +/***************************************************************************** + * Small structures ( <= 64 bits). These are used to test passing small + * structures as parameters and test argument size promotion. + *****************************************************************************/ + + /* 64 bits + */ +struct small_rep_info_t { + int value; + int head; +}; + +/* 6 bits : really fits in 8 bits and is promoted to 32 bits + */ +struct bit_flags_t { + unsigned alpha :1; + unsigned beta :1; + unsigned gamma :1; + unsigned delta :1; + unsigned epsilon :1; + unsigned omega :1; +}; + +/* 22 bits : really fits in 40 bits and is promoted to 64 bits + */ +struct bit_flags_combo_t { + unsigned alpha :1; + unsigned beta :1; + char ch1; + unsigned gamma :1; + unsigned delta :1; + char ch2; + unsigned epsilon :1; + unsigned omega :1; +}; + +/* 64 bits + */ +struct one_double_t { + double double1; +}; + +/* 64 bits + */ +struct two_floats_t { + float float1; + float float2; +}; + + +/* 24 bits : promoted to 32 bits + */ +struct three_char_t { + char ch1; + char ch2; + char ch3; +}; + +/* 40 bits : promoted to 64 bits + */ +struct five_char_t { + char ch1; + char ch2; + char ch3; + char ch4; + char ch5; +}; + +/* 40 bits : promoted to 64 bits + */ +struct int_char_combo_t { + int int1; + char ch1; +}; + + +/***************************************************************** + * LOOP_COUNT : + * A do nothing function. Used to provide a point at which calls can be made. + *****************************************************************/ +void loop_count () { + + int index; + + for (index=0; index<4; index++); +} + +/***************************************************************** + * INIT_BIT_FLAGS : + * Initializes a bit_flags_t structure. Can call this function see + * the call command behavior when integer arguments do not fit into + * registers and must be placed on the stack. + * OUT struct bit_flags_t *bit_flags -- structure to be filled + * IN unsigned a -- 0 or 1 + * IN unsigned b -- 0 or 1 + * IN unsigned g -- 0 or 1 + * IN unsigned d -- 0 or 1 + * IN unsigned e -- 0 or 1 + * IN unsigned o -- 0 or 1 + *****************************************************************/ +void init_bit_flags (bit_flags,a,b,g,d,e,o) +struct bit_flags_t *bit_flags; +unsigned a; +unsigned b; +unsigned g; +unsigned d; +unsigned e; +unsigned o; +{ + + bit_flags->alpha = a; + bit_flags->beta = b; + bit_flags->gamma = g; + bit_flags->delta = d; + bit_flags->epsilon = e; + bit_flags->omega = o; +} + +/***************************************************************** + * INIT_BIT_FLAGS_COMBO : + * Initializes a bit_flags_combo_t structure. Can call this function + * to see the call command behavior when integer and character arguments + * do not fit into registers and must be placed on the stack. + * OUT struct bit_flags_combo_t *bit_flags_combo -- structure to fill + * IN unsigned a -- 0 or 1 + * IN unsigned b -- 0 or 1 + * IN char ch1 + * IN unsigned g -- 0 or 1 + * IN unsigned d -- 0 or 1 + * IN char ch2 + * IN unsigned e -- 0 or 1 + * IN unsigned o -- 0 or 1 + *****************************************************************/ +void init_bit_flags_combo (bit_flags_combo, a, b, ch1, g, d, ch2, e, o) +struct bit_flags_combo_t *bit_flags_combo; +unsigned a; +unsigned b; +char ch1; +unsigned g; +unsigned d; +char ch2; +unsigned e; +unsigned o; +{ + + bit_flags_combo->alpha = a; + bit_flags_combo->beta = b; + bit_flags_combo->ch1 = ch1; + bit_flags_combo->gamma = g; + bit_flags_combo->delta = d; + bit_flags_combo->ch2 = ch2; + bit_flags_combo->epsilon = e; + bit_flags_combo->omega = o; +} + + +/***************************************************************** + * INIT_ONE_DOUBLE : + * OUT struct one_double_t *one_double -- structure to fill + * IN double init_val + *****************************************************************/ +void init_one_double (one_double, init_val) +struct one_double_t *one_double; +double init_val; +{ + + one_double->double1 = init_val; +} + +/***************************************************************** + * INIT_TWO_FLOATS : + * OUT struct two_floats_t *two_floats -- structure to be filled + * IN float init_val1 + * IN float init_val2 + *****************************************************************/ +void init_two_floats (two_floats, init_val1, init_val2) +struct two_floats_t *two_floats; +float init_val1; +float init_val2; +{ + + two_floats->float1 = init_val1; + two_floats->float2 = init_val2; +} + +/***************************************************************** + * INIT_THREE_CHARS : + * OUT struct three_char_t *three_char -- structure to be filled + * IN char init_val1 + * IN char init_val2 + * IN char init_val3 + *****************************************************************/ +void init_three_chars ( three_char, init_val1, init_val2, init_val3) +struct three_char_t *three_char; +char init_val1; +char init_val2; +char init_val3; +{ + + three_char->ch1 = init_val1; + three_char->ch2 = init_val2; + three_char->ch3 = init_val3; +} + +/***************************************************************** + * INIT_FIVE_CHARS : + * OUT struct five_char_t *five_char -- structure to be filled + * IN char init_val1 + * IN char init_val2 + * IN char init_val3 + * IN char init_val4 + * IN char init_val5 + *****************************************************************/ +void init_five_chars ( five_char, init_val1, init_val2, init_val3, init_val4, init_val5) +struct five_char_t *five_char; +char init_val1; +char init_val2; +char init_val3; +char init_val4; +char init_val5; +{ + + five_char->ch1 = init_val1; + five_char->ch2 = init_val2; + five_char->ch3 = init_val3; + five_char->ch4 = init_val4; + five_char->ch5 = init_val5; +} + +/***************************************************************** + * INIT_INT_CHAR_COMBO : + * OUT struct int_char_combo_t *combo -- structure to be filled + * IN int init_val1 + * IN char init_val2 + *****************************************************************/ +void init_int_char_combo ( combo, init_val1, init_val2) +struct int_char_combo_t *combo; +int init_val1; +char init_val2; +{ + + combo->int1 = init_val1; + combo->ch1 = init_val2; +} + +/***************************************************************** + * INIT_STRUCT_REP : + * OUT struct small_rep_into_t *small_struct -- structure to be filled + * IN int seed + *****************************************************************/ +void init_struct_rep( small_struct, seed) +struct small_rep_info_t *small_struct; +int seed; + +{ + + small_struct->value = 2 + (seed*2); + small_struct->head = 0; +} + +/***************************************************************** + * PRINT_BIT_FLAGS : + * IN struct bit_flags_t bit_flags + ****************************************************************/ +struct bit_flags_t print_bit_flags ( bit_flags) +struct bit_flags_t bit_flags; +{ + + if (bit_flags.alpha) printf("alpha\n"); + if (bit_flags.beta) printf("beta\n"); + if (bit_flags.gamma) printf("gamma\n"); + if (bit_flags.delta) printf("delta\n"); + if (bit_flags.epsilon) printf("epsilon\n"); + if (bit_flags.omega) printf("omega\n"); + return bit_flags; + +} + +/***************************************************************** + * PRINT_BIT_FLAGS_COMBO : + * IN struct bit_flags_combo_t bit_flags_combo + ****************************************************************/ +struct bit_flags_combo_t print_bit_flags_combo ( bit_flags_combo ) +struct bit_flags_combo_t bit_flags_combo; +{ + + if (bit_flags_combo.alpha) printf("alpha\n"); + if (bit_flags_combo.beta) printf("beta\n"); + if (bit_flags_combo.gamma) printf("gamma\n"); + if (bit_flags_combo.delta) printf("delta\n"); + if (bit_flags_combo.epsilon) printf("epsilon\n"); + if (bit_flags_combo.omega) printf("omega\n"); + printf("ch1: %c\tch2: %c\n", bit_flags_combo.ch1, bit_flags_combo.ch2); + return bit_flags_combo; + +} + +/***************************************************************** + * PRINT_ONE_DOUBLE : + * IN struct one_double_t one_double + ****************************************************************/ +struct one_double_t print_one_double ( one_double ) +struct one_double_t one_double; +{ + + printf("Contents of one_double_t: \n\n"); + printf("%f\n", one_double.double1); + return one_double; + +} + +/***************************************************************** + * PRINT_TWO_FLOATS : + * IN struct two_floats_t two_floats + ****************************************************************/ +struct two_floats_t print_two_floats ( two_floats ) +struct two_floats_t two_floats; +{ + + printf("Contents of two_floats_t: \n\n"); + printf("%f\t%f\n", two_floats.float1, two_floats.float2); + return two_floats; + +} + +/***************************************************************** + * PRINT_THREE_CHARS : + * IN struct three_char_t three_char + ****************************************************************/ +struct three_char_t print_three_chars ( three_char ) +struct three_char_t three_char; +{ + + printf("Contents of three_char_t: \n\n"); + printf("%c\t%c\t%c\n", three_char.ch1, three_char.ch2, three_char.ch3); + return three_char; + +} + +/***************************************************************** + * PRINT_FIVE_CHARS : + * IN struct five_char_t five_char + ****************************************************************/ +struct five_char_t print_five_chars ( five_char ) +struct five_char_t five_char; +{ + + printf("Contents of five_char_t: \n\n"); + printf("%c\t%c\t%c\t%c\t%c\n", five_char.ch1, five_char.ch2, + five_char.ch3, five_char.ch4, + five_char.ch5); + return five_char; + +} + +/***************************************************************** + * PRINT_INT_CHAR_COMBO : + * IN struct int_char_combo_t int_char_combo + ****************************************************************/ +struct int_char_combo_t print_int_char_combo ( int_char_combo ) +struct int_char_combo_t int_char_combo; +{ + + printf("Contents of int_char_combo_t: \n\n"); + printf("%d\t%c\n", int_char_combo.int1, int_char_combo.ch1); + return int_char_combo; + +} + +/***************************************************************** + * PRINT_STRUCT_REP : + ****************************************************************/ +struct small_rep_info_t print_struct_rep( struct1 ) +struct small_rep_info_t struct1; + +{ + + printf("Contents of struct1: \n\n"); + printf("%10d%10d\n", struct1.value, struct1.head); + struct1.value =+5; + + return struct1; + + +} + + +struct array_rep_info_t print_one_large_struct( linked_list1 ) +struct array_rep_info_t linked_list1; +{ + + + printf("%10d%10d\n", linked_list1.values[0], + linked_list1.next_index[0]); + + return linked_list1; + +} + +/***************************************************************** + * INIT_ARRAY_REP : + * IN struct array_rep_info_t *linked_list + * IN int seed + ****************************************************************/ +void init_array_rep( linked_list, seed ) +struct array_rep_info_t *linked_list; +int seed; + +{ + + int index; + + for (index = 0; index < 10; index++) { + + linked_list->values[index] = (2*index) + (seed*2); + linked_list->next_index[index] = index + 1; + } + linked_list->head = 0; +} + + +int main () { + + /* variables for large structure testing + */ + int number = 10; + struct array_rep_info_t *list1; + + /* variables for testing a small structures and a very long argument list + */ + struct small_rep_info_t *struct1; + struct bit_flags_t *flags; + struct bit_flags_combo_t *flags_combo; + struct three_char_t *three_char; + struct five_char_t *five_char; + struct int_char_combo_t *int_char_combo; + struct one_double_t *d1; + struct two_floats_t *f3; + + + /* Allocate space for large structures + */ + list1 = (struct array_rep_info_t *)malloc(sizeof(struct array_rep_info_t)); + + /* Initialize large structures + */ + init_array_rep(list1, 2); + + /* Print large structures + */ + print_one_large_struct(*list1); + + /* Allocate space for small structures + */ + struct1 = (struct small_rep_info_t *)malloc(sizeof(struct small_rep_info_t)); + flags = (struct bit_flags_t *)malloc(sizeof(struct bit_flags_t)); + flags_combo = (struct bit_flags_combo_t *)malloc(sizeof(struct bit_flags_combo_t)); + three_char = (struct three_char_t *)malloc(sizeof(struct three_char_t)); + five_char = (struct five_char_t *)malloc(sizeof(struct five_char_t)); + int_char_combo = (struct int_char_combo_t *)malloc(sizeof(struct int_char_combo_t)); + + d1 = (struct one_double_t *)malloc(sizeof(struct one_double_t)); + f3 = (struct two_floats_t *)malloc(sizeof(struct two_floats_t)); + + /* Initialize small structures + */ + init_one_double ( d1, 1.11111); + init_two_floats ( f3, -2.345, 1.0); + init_bit_flags(flags, (unsigned)1, (unsigned)0, (unsigned)1, + (unsigned)0, (unsigned)1, (unsigned)0 ); + init_bit_flags_combo(flags_combo, (unsigned)1, (unsigned)0, 'y', + (unsigned)1, (unsigned)0, 'n', + (unsigned)1, (unsigned)0 ); + init_three_chars(three_char, 'x', 'y', 'z'); + init_five_chars(five_char, 'h', 'e', 'l', 'l', 'o'); + init_int_char_combo(int_char_combo, 13, '!'); + init_struct_rep(struct1, 10); + + + /* Print small structures + */ + print_one_double(*d1); + print_two_floats(*f3); + print_bit_flags(*flags); + print_bit_flags_combo(*flags_combo); + print_three_chars(*three_char); + print_five_chars(*five_char); + print_int_char_combo(*int_char_combo); + print_struct_rep(*struct1); + + loop_count(); + + return 0; +} + + + + + + + + + + + + + + + diff --git a/gdb/testsuite/gdb.base/callfuncs2.exp b/gdb/testsuite/gdb.base/callfuncs2.exp new file mode 100644 index 0000000000..8b17b6346b --- /dev/null +++ b/gdb/testsuite/gdb.base/callfuncs2.exp @@ -0,0 +1,276 @@ +# Copyright (C) 1997, 1998 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 2 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, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +# Please email any bugs, comments, and/or additions to this file to: +# bug-gdb@prep.ai.mit.edu + +# This file was written by Fred Fish. (fnf@cygnus.com) + +# SAME tests as in callfuncs.exp but here the inferior program does not call malloc. + + + +if $tracelevel then { + strace $tracelevel +} + +set prms_id 0 +set bug_id 0 + +set testfile "callfuncs2" +set srcfile ${testfile}.c +set binfile ${objdir}/${subdir}/${testfile} + +set prototypes 1 +if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } { + set prototypes 0; + # built the second test case since we can't use prototypes + warning "Prototypes not supported, rebuilding with -DNO_PROTOTYPES" + if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug additional_flags=-DNO_PROTOTYPES}] != "" } { + gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." + } +} + +# Create and source the file that provides information about the compiler +# used to compile the test case. + +if [get_compiler_info ${binfile}] { + return -1; +} + + + +# The a29k can't call functions, so don't even bother with this test. +if [target_info exists gdb,cannot_call_functions] { + setup_xfail "*-*-*" 2416 + fail "This target can not call functions" + continue +} + +# Set the current language to C. This counts as a test. If it +# fails, then we skip the other tests. + +proc set_lang_c {} { + global gdb_prompt + + send_gdb "set language c\n" + gdb_expect { + -re ".*$gdb_prompt $" {} + timeout { fail "set language c (timeout)" ; return 0 } + } + + send_gdb "show language\n" + gdb_expect { + -re ".* source language is \"c\".*$gdb_prompt $" { + pass "set language to \"c\"" + return 1 + } + -re ".*$gdb_prompt $" { + fail "setting language to \"c\"" + return 0 + } + timeout { + fail "can't show language (timeout)" + return 0 + } + } +} + +# FIXME: Before calling this proc, we should probably verify that +# we can call inferior functions and get a valid integral value +# returned. +# Note that it is OK to check for 0 or 1 as the returned values, because C +# specifies that the numeric value of a relational or logical expression +# (computed in the inferior) is 1 for true and 0 for false. + +proc do_function_calls {} { + global prototypes + global gcc_compiled + # We need to up this because this can be really slow on some boards. + set timeout 60; + + gdb_test "p t_char_values(0,0)" " = 0" + gdb_test "p t_char_values('a','b')" " = 1" + gdb_test "p t_char_values(char_val1,char_val2)" " = 1" + gdb_test "p t_char_values('a',char_val2)" " = 1" + gdb_test "p t_char_values(char_val1,'b')" " = 1" + + gdb_test "p t_short_values(0,0)" " = 0" + gdb_test "p t_short_values(10,-23)" " = 1" + gdb_test "p t_short_values(short_val1,short_val2)" " = 1" + gdb_test "p t_short_values(10,short_val2)" " = 1" + gdb_test "p t_short_values(short_val1,-23)" " = 1" + + gdb_test "p t_int_values(0,0)" " = 0" + gdb_test "p t_int_values(87,-26)" " = 1" + gdb_test "p t_int_values(int_val1,int_val2)" " = 1" + gdb_test "p t_int_values(87,int_val2)" " = 1" + gdb_test "p t_int_values(int_val1,-26)" " = 1" + + gdb_test "p t_long_values(0,0)" " = 0" + gdb_test "p t_long_values(789,-321)" " = 1" + gdb_test "p t_long_values(long_val1,long_val2)" " = 1" + gdb_test "p t_long_values(789,long_val2)" " = 1" + gdb_test "p t_long_values(long_val1,-321)" " = 1" + + if ![target_info exists gdb,skip_float_tests] { + gdb_test "p t_float_values(0.0,0.0)" " = 0" + + # These next four tests fail on the mn10300. + # The first value is passed in regs, the other in memory. + # Gcc emits different stabs for the two parameters; the first is + # claimed to be a float, the second a double. + # dbxout.c in gcc claims this is the desired behavior. + setup_xfail "mn10300-*-*" + gdb_test "p t_float_values(3.14159,-2.3765)" " = 1" + setup_xfail "mn10300-*-*" + gdb_test "p t_float_values(float_val1,float_val2)" " = 1" + setup_xfail "mn10300-*-*" + gdb_test "p t_float_values(3.14159,float_val2)" " = 1" + setup_xfail "mn10300-*-*" + gdb_test "p t_float_values(float_val1,-2.3765)" " = 1" + + # Test passing of arguments which might not be widened. + gdb_test "p t_float_values2(0.0,0.0)" " = 0" + + # Although PR 5318 mentions SunOS specifically, this seems + # to be a generic problem on quite a few platforms. + if $prototypes then { + setup_xfail "hppa*-*-*" "sparc-*-*" "mips*-*-*" 5318 + if {!$gcc_compiled} then { + setup_xfail "alpha-dec-osf2*" "i*86-*-sysv4*" 5318 + } + } + gdb_test "p t_float_values2(3.14159,float_val2)" " = 1" + gdb_test "p t_small_values(1,2,3,4,5,6,7,8,9,10)" " = 55" + + gdb_test "p t_double_values(0.0,0.0)" " = 0" + gdb_test "p t_double_values(45.654,-67.66)" " = 1" + gdb_test "p t_double_values(double_val1,double_val2)" " = 1" + gdb_test "p t_double_values(45.654,double_val2)" " = 1" + gdb_test "p t_double_values(double_val1,-67.66)" " = 1" + + } + + gdb_test "p t_string_values(string_val2,string_val1)" " = 0" + gdb_test "p t_string_values(string_val1,string_val2)" " = 1" + gdb_test "p t_string_values(\"string 1\",\"string 2\")" " = 1" + gdb_test "p t_string_values(\"string 1\",string_val2)" " = 1" + gdb_test "p t_string_values(string_val1,\"string 2\")" " = 1" + + gdb_test "p t_char_array_values(char_array_val2,char_array_val1)" " = 0" + gdb_test "p t_char_array_values(char_array_val1,char_array_val2)" " = 1" + gdb_test "p t_char_array_values(\"carray 1\",\"carray 2\")" " = 1" + gdb_test "p t_char_array_values(\"carray 1\",char_array_val2)" " = 1" + gdb_test "p t_char_array_values(char_array_val1,\"carray 2\")" " = 1" + + gdb_test "p doubleit(4)" " = 8" + gdb_test "p add(4,5)" " = 9" + gdb_test "p t_func_values(func_val2,func_val1)" " = 0" + gdb_test "p t_func_values(func_val1,func_val2)" " = 1" + + # On the rs6000, we need to pass the address of the trampoline routine, + # not the address of add itself. I don't know how to go from add to + # the address of the trampoline. Similar problems exist on the HPPA, + # and in fact can present an unsolvable problem as the stubs may not + # even exist in the user's program. We've slightly recoded t_func_values + # to avoid such problems in the common case. This may or may not help + # the RS6000. + setup_xfail "rs6000*-*-*" + setup_xfail "powerpc*-*-*" + + if {!$gcc_compiled && [istarget hppa*-*-hpux*]} then { + gdb_test "p t_func_values(add,func_val2)" "You cannot.*ignored.*" + } else { + gdb_test "p t_func_values(add,func_val2)" " = 1" + } + + setup_xfail "rs6000*-*-*" + setup_xfail "powerpc*-*-*" + + if {!$gcc_compiled && [istarget hppa*-*-hpux*]} then { + gdb_test "p t_func_values(func_val1,doubleit)" "You cannot.*ignored.*" + } else { + gdb_test "p t_func_values(func_val1,doubleit)" " = 1" + } + + gdb_test "p t_call_add(func_val1,3,4)" " = 7" + + setup_xfail "rs6000*-*-*" + setup_xfail "powerpc*-*-*" + + if {!$gcc_compiled && [istarget hppa*-*-hpux*]} then { + gdb_test "p t_call_add(add,3,4)" "You cannot.*ignored.*" + } else { + gdb_test "p t_call_add(add,3,4)" " = 7" + } + + gdb_test "p t_enum_value1(enumval1)" " = 1" + gdb_test "p t_enum_value1(enum_val1)" " = 1" + gdb_test "p t_enum_value1(enum_val2)" " = 0" + + gdb_test "p t_enum_value2(enumval2)" " = 1" + gdb_test "p t_enum_value2(enum_val2)" " = 1" + gdb_test "p t_enum_value2(enum_val1)" " = 0" + + gdb_test "p sum_args(1,{2})" " = 2" + gdb_test "p sum_args(2,{2,3})" " = 5" + gdb_test "p sum_args(3,{2,3,4})" " = 9" + gdb_test "p sum_args(4,{2,3,4,5})" " = 14" + gdb_test "p sum10 (1, 2, 3, 4, 5, 6, 7, 8, 9, 10)" " = 55" + + gdb_test "p t_structs_c(struct_val1)" "= 120 'x'" \ + "call inferior func with struct - returns char" + gdb_test "p t_structs_s(struct_val1)" "= 87" \ + "call inferior func with struct - returns short" + gdb_test "p t_structs_i(struct_val1)" "= 76" \ + "call inferior func with struct - returns int" + gdb_test "p t_structs_l(struct_val1)" "= 51" \ + "call inferior func with struct - returns long" + setup_xfail "i*86-*-*" + gdb_test "p t_structs_f(struct_val1)" "= 2.12.*" \ + "call inferior func with struct - returns float" + setup_xfail "i*86-*-*" + gdb_test "p t_structs_d(struct_val1)" "= 9.87.*" \ + "call inferior func with struct - returns double" + gdb_test "p t_structs_a(struct_val1)" "= (.unsigned char .. )?\"foo\"" \ + "call inferior func with struct - returns char *" + +} + +# Start with a fresh gdb. + +gdb_exit +gdb_start +gdb_reinitialize_dir $srcdir/$subdir +gdb_load ${binfile} + +gdb_test "set print sevenbit-strings" "" +gdb_test "set print address off" "" +gdb_test "set width 0" "" + +if { ![set_lang_c] } { + gdb_suppress_tests; +} else { + if { ![runto_main] } { + gdb_suppress_tests; + } +} + +gdb_test "next" ".*" +do_function_calls + +return 0 diff --git a/gdb/testsuite/gdb.base/constvars.exp b/gdb/testsuite/gdb.base/constvars.exp new file mode 100644 index 0000000000..e5874879cf --- /dev/null +++ b/gdb/testsuite/gdb.base/constvars.exp @@ -0,0 +1,963 @@ +# Copyright (C) 1997, 1998 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 2 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, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +# Please email any bugs, comments, and/or additions to this file to: +# bug-gdb@prep.ai.mit.edu + +# written by Elena Zannoni (elz@apollo.hp.com) +# +# This file is part of the gdb testsuite +# +# tests for const variables +# const pointers to vars +# pointers to const variables +# const pointers to const vars +# with mixed types + +if $tracelevel then { + strace $tracelevel + } + +# +# test running programs +# +set prms_id 0 +set bug_id 0 + +set testfile "constvars" +set srcfile ${testfile}.c +set binfile ${objdir}/${subdir}/${testfile} + +if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug c++}] != "" } { + gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." +} + + +gdb_exit +gdb_start +gdb_reinitialize_dir $srcdir/$subdir +gdb_load ${binfile} + + +# +# set it up at a breakpoint so we can play with the variable values +# +if ![runto_main] then { + perror "couldn't run to breakpoint" + continue +} + +send_gdb "break marker1\n" ; gdb_expect -re ".*$gdb_prompt $" + + send_gdb "cont\n" + gdb_expect { + -re "Break.* marker1 \\(\\) at .*:$decimal.*$gdb_prompt $" { + send_gdb "up\n" + gdb_expect { + -re ".*$gdb_prompt $" {} + timeout { fail "up from marker1" } + } + } + -re "Break.* marker1__.* \\(\\) at .*:$decimal.*$gdb_prompt $" { + fail "continue to marker1 (demangling)" + send_gdb "up\n" + gdb_expect { + -re ".*$gdb_prompt $" {} + timeout { fail "up from marker1" } + } + } + -re "$gdb_prompt $" { fail "continue to marker1" } + timeout { fail "(timeout) continue to marker1" } + } + +# test function parameters +send_gdb "ptype qux1\n" +gdb_expect { + -re "type = int \\(const char, const char &, const char \\*, char \\* const\\).*$gdb_prompt $" { + pass "ptype qux1" + } + -re ".*$gdb_prompt $" { fail "ptype qux1" } + timeout { fail "(timeout) ptype qux1" } + } + +# test vars and pointers + +send_gdb "print lave\n" +gdb_expect { + -re ".\[0-9\]* = 66 \'B\'.*$gdb_prompt $" { + pass "print value of lave" + } + -re ".*$gdb_prompt $" { fail "print value of lave" } + timeout { fail "(timeout) print value of lave" } + } + + +send_gdb "ptype lave\n" +gdb_expect { + -re "type = char.*$gdb_prompt $" { pass "ptype lave" } + -re ".*$gdb_prompt $" { fail "ptype lave" } + timeout { fail "(timeout) ptype lave" } +} + + +send_gdb "print lavish\n" +gdb_expect { + -re ".\[0-9\]* = 10 \'\\\\n\'.*$gdb_prompt $" { + pass "print value of lavish" + } + -re ".*$gdb_prompt $" { fail "print value of lavish" } + timeout { fail "(timeout) print value of lavish" } + } + + +send_gdb "ptype lavish\n" +gdb_expect { + -re "type = unsigned char.*$gdb_prompt $" { pass "ptype lavish" } + -re ".*$gdb_prompt $" { fail "ptype lavish " } + timeout { fail "(timeout) ptype lavish " } +} + + +send_gdb "print lax\n" +gdb_expect { + -re ".\[0-9\]* = 20.*$gdb_prompt $" { + pass "print value of lax" + } + -re ".*$gdb_prompt $" { fail "print value of lax" } + timeout { fail "(timeout) print value of lax" } + } + + +send_gdb "ptype lax\n" +gdb_expect { + -re "type = short.*$gdb_prompt $" { pass "ptype lax" } + -re ".*$gdb_prompt $" { fail "ptype lax" } + timeout { fail "(timeout) ptype lax" } +} + + +send_gdb "print lecherous\n" +gdb_expect { + -re ".\[0-9\]* = 30.*$gdb_prompt $" { + pass "print value of lecherous" + } + -re ".*$gdb_prompt $" { fail "print value of lecherous" } + timeout { fail "(timeout) print value of lecherous" } + } + + +send_gdb "ptype lecherous\n" +gdb_expect { + -re "type = unsigned short.*$gdb_prompt $" { pass "ptype lecherous" } + -re "type = short unsigned.*$gdb_prompt $" { pass "ptype lecherous" } + -re ".*$gdb_prompt $" { fail "ptype lecherous" } + timeout { fail "(timeout) ptype lecherous" } +} + + +send_gdb "print lechery\n" +gdb_expect { + -re ".\[0-9\]* = 40.*$gdb_prompt $" { + pass "print value of lechery" + } + -re ".*$gdb_prompt $" { fail "print value of lechery" } + timeout { fail "(timeout) print value of lechery" } + } + + +send_gdb "ptype lechery\n" +gdb_expect { + -re "type = long.*$gdb_prompt $" { pass "ptype lechery" } + -re ".*$gdb_prompt $" { fail "ptype lechery" } + timeout { fail "(timeout) ptype lechery" } +} + + +send_gdb "print lectern\n" +gdb_expect { + -re ".\[0-9\]* = 50.*$gdb_prompt $" { + pass "print value of lectern" + } + -re ".*$gdb_prompt $" { fail "print value of lectern" } + timeout { fail "(timeout) print value of lectern " } + } + + +send_gdb "ptype lectern\n" +gdb_expect { + -re "type = unsigned long.*$gdb_prompt $" { pass "ptype lectern" } + -re "type = long unsigned.*$gdb_prompt $" { pass "ptype lectern" } + -re ".*$gdb_prompt $" { fail "ptype lectern" } + timeout { fail "(timeout) ptype lectern" } +} + + +send_gdb "print leeway\n" +gdb_expect { + -re ".\[0-9\]* = 60.*$gdb_prompt $" { + pass "print value of leeway" + } + -re ".*$gdb_prompt $" { fail "print value of leeway" } + timeout { fail "(timeout) print value of leeway" } + } + + +send_gdb "ptype leeway\n" +gdb_expect { + -re "type = float.*$gdb_prompt $" { pass "ptype leeway" } + -re ".*$gdb_prompt $" { fail "ptype leeway" } + timeout { fail "(timeout) ptype leeway" } +} + + +send_gdb "print legacy\n" +gdb_expect { + -re ".\[0-9\]* = 70.*$gdb_prompt $" { + pass "print value of legacy" + } + -re ".*$gdb_prompt $" { fail "print value of legacy" } + timeout { fail "(timeout) print value of legacy" } + } + + +send_gdb "ptype legacy\n" +gdb_expect { + -re "type = double.*$gdb_prompt $" { pass "ptype legacy" } + -re ".*$gdb_prompt $" { fail "ptype legacy" } + timeout { fail "(timeout) ptype legacy" } +} + + +send_gdb "print laconic\n" +gdb_expect { + -re ".\[0-9\]* = 65 \'A\'.*$gdb_prompt $" { + pass "print value of laconic" + } + -re ".*$gdb_prompt $" { fail "print value of laconic" } + timeout { fail "(timeout) print value of laconic" } + } + + +send_gdb "ptype laconic\n" +gdb_expect { + -re "type = const char.*$gdb_prompt $" { pass "ptype laconic" } + -re ".*$gdb_prompt $" { fail "ptype laconic" } + timeout { fail "(timeout) ptype laconic" } +} + + +send_gdb "print laggard\n" +gdb_expect { + -re ".\[0-9\]* = 1 \'.001\'.*$gdb_prompt $" { + pass "print value of laggard" + } + -re ".*$gdb_prompt $" { fail "print value of laggard" } + timeout { fail "(timeout) print value of laggard" } + } + + +send_gdb "ptype laggard\n" +gdb_expect { + -re "type = const unsigned char.*$gdb_prompt $" { pass "ptype laggard" } + -re ".*$gdb_prompt $" { fail "ptype laggard" } + timeout { fail "(timeout) ptype laggard" } +} + + +send_gdb "print lagoon\n" +gdb_expect { + -re ".\[0-9\]* = 2.*$gdb_prompt $" { + pass "print value of lagoon" + } + -re ".*$gdb_prompt $" { fail "print value of lagoon" } + timeout { fail "(timeout) print value of lagoon" } + } + + +send_gdb "ptype lagoon\n" +gdb_expect { + -re "type = const short.*$gdb_prompt $" { pass "ptype lagoon" } + -re ".*$gdb_prompt $" { fail "ptype lagoon" } + timeout { fail "(timeout) ptype lagoon" } +} + + +send_gdb "print laity\n" +gdb_expect { + -re ".\[0-9\]* = 3.*$gdb_prompt $" { + pass "print value of laity" + } + -re ".*$gdb_prompt $" { fail "print value of laity" } + timeout { fail "(timeout) print value of laity" } + } + + +send_gdb "ptype laity\n" +gdb_expect { + -re "type = const unsigned short.*$gdb_prompt $" { pass "ptype laity" } + -re ".*$gdb_prompt $" { fail "ptype laity" } + timeout { fail "(timeout) ptype "laity } +} + + +send_gdb "print lambent\n" +gdb_expect { + -re ".\[0-9\]* = 4.*$gdb_prompt $" { + pass "print value of lambent" + } + -re ".*$gdb_prompt $" { fail "print value of lambent" } + timeout { fail "(timeout) print value of lambent" } + } + + +send_gdb "ptype lambent\n" +gdb_expect { + -re "type = const long.*$gdb_prompt $" { pass "ptype lambent" } + -re ".*$gdb_prompt $" { fail "ptype lambent" } + timeout { fail "(timeout) ptype lambent" } +} + + +send_gdb "print laminated\n" +gdb_expect { + -re ".\[0-9\]* = 5.*$gdb_prompt $" { + pass "print value of laminated" + } + -re ".*$gdb_prompt $" { fail "print value of laminated" } + timeout { fail "(timeout) print value of laminated" } + } + + +send_gdb "ptype laminated\n" +gdb_expect { + -re "type = const unsigned long.*$gdb_prompt $" { pass "ptype laminated" } + -re ".*$gdb_prompt $" { fail "ptype laminated" } + timeout { fail "(timeout) ptype laminated" } +} + + +send_gdb "print lampoon\n" +gdb_expect { + -re ".\[0-9\]* = 6.*$gdb_prompt $" { + pass "print value of lampoon" + } + -re ".*$gdb_prompt $" { fail "print value of lampoon" } + timeout { fail "(timeout) print value of lampoon" } + } + + +send_gdb "ptype lampoon\n" +gdb_expect { + -re "type = const float.*$gdb_prompt $" { pass "ptype lampoon" } + -re ".*$gdb_prompt $" { fail "ptype lampoon" } + timeout { fail "(timeout) ptype lampoon" } +} + + +send_gdb "print languid\n" +gdb_expect { + -re ".\[0-9\]* = 7.*$gdb_prompt $" { + pass "print value of languid" + } + -re ".*$gdb_prompt $" { fail "print value of languid" } + timeout { fail "(timeout) print value of languid" } + } + + +send_gdb "ptype languid\n" +gdb_expect { + -re "type = const double.*$gdb_prompt $" { pass "ptype languid" } + -re ".*$gdb_prompt $" { fail "ptype languid" } + timeout { fail "(timeout) ptype languid" } +} + + +send_gdb "print *legend\n" +gdb_expect { + -re ".\[0-9\]* = 66 \'B\'.*$gdb_prompt $" { + pass "print value of *legend" + } + -re ".*$gdb_prompt $" { fail "print value of *legend" } + timeout { fail "(timeout) print value of *legend" } + } + + +send_gdb "ptype legend\n" +gdb_expect { + -re "type = const char \\*.*$gdb_prompt $" { pass "ptype legend" } + -re ".*$gdb_prompt $" { fail "ptype legend" } + timeout { fail "(timeout) ptype legend" } +} + + +send_gdb "print *legerdemain\n" +gdb_expect { + -re ".\[0-9\]* = 10 \'\\\\n\'.*$gdb_prompt $" { + pass "print value of *legerdemain" + } + -re ".*$gdb_prompt $" { fail "print value of *legerdemain" } + timeout { fail "(timeout) print value of *legerdemain" } + } + + +send_gdb "ptype legerdemain\n" +gdb_expect { + -re "type = const unsigned char \\*.*$gdb_prompt $" { pass "ptype legerdemain" } + -re ".*$gdb_prompt $" { fail "ptype legerdemain" } + timeout { fail "(timeout) ptype legerdemain" } +} + + +send_gdb "print *leniency\n" +gdb_expect { + -re ".\[0-9\]* = 20.*$gdb_prompt $" { + pass "print value of *leniency" + } + -re ".*$gdb_prompt $" { fail "print value of *leniency" } + timeout { fail "(timeout) print value of *leniency" } + } + + +send_gdb "ptype leniency\n" +gdb_expect { + -re "type = const short \\*.*$gdb_prompt $" { pass "ptype leniency" } + -re ".*$gdb_prompt $" { fail "ptype leniency " } + timeout { fail "(timeout) ptype leniency" } +} + + +send_gdb "print *leonine\n" +gdb_expect { + -re ".\[0-9\]* = 30.*$gdb_prompt $" { + pass "print value of *leonine" + } + -re ".*$gdb_prompt $" { fail "print value of *leonine" } + timeout { fail "(timeout) print value of *leonine" } + } + + +send_gdb "ptype leonine\n" +gdb_expect { + -re "type = const unsigned short \\*.*$gdb_prompt $" { pass "ptype leonine" } + -re ".*$gdb_prompt $" { fail "ptype leonine" } + timeout { fail "(timeout) ptype leonine" } +} + + +send_gdb "print *lesion\n" +gdb_expect { + -re ".\[0-9\]* = 40.*$gdb_prompt $" { + pass "print value of *lesion" + } + -re ".*$gdb_prompt $" { fail "print value of *lesion" } + timeout { fail "(timeout) print value of *lesion" } + } + + +send_gdb "ptype lesion\n" +gdb_expect { + -re "type = const long \\*.*$gdb_prompt $" { pass "ptype lesion" } + -re ".*$gdb_prompt $" { fail "ptype lesion" } + timeout { fail "(timeout) ptype lesion" } +} + + +send_gdb "print *lethal\n" +gdb_expect { + -re ".\[0-9\]* = 50.*$gdb_prompt $" { + pass "print value of *lethal" + } + -re ".*$gdb_prompt $" { fail "print value of *lethal" } + timeout { fail "(timeout) print value of *lethal" } + } + + +send_gdb "ptype lethal\n" +gdb_expect { + -re "type = const unsigned long \\*.*$gdb_prompt $" { pass "ptype lethal" } + -re ".*$gdb_prompt $" { fail "ptype lethal" } + timeout { fail "(timeout) ptype lethal" } +} + + +send_gdb "print *lethargic\n" +gdb_expect { + -re ".\[0-9\]* = 60.*$gdb_prompt $" { + pass "print value of *lethargic" + } + -re ".*$gdb_prompt $" { fail "print value of *lethargic" } + timeout { fail "(timeout) print value of *lethargic" } + } + + +send_gdb "ptype lethargic\n" +gdb_expect { + -re "type = const float \\*.*$gdb_prompt $" { pass "ptype lethargic" } + -re ".*$gdb_prompt $" { fail "ptype lethargic" } + timeout { fail "(timeout) ptype lethargic" } +} + + +send_gdb "print *levity\n" +gdb_expect { + -re ".\[0-9\]* = 70.*$gdb_prompt $" { + pass "print value of *levity" + } + -re ".*$gdb_prompt $" { fail "print value of *levity" } + timeout { fail "(timeout) print value of *levity" } + } + + +send_gdb "ptype levity\n" +gdb_expect { + -re "type = const double \\*.*$gdb_prompt $" { pass "ptype levity" } + -re ".*$gdb_prompt $" { fail "ptype levity" } + timeout { fail "(timeout) ptype levity" } +} + + +send_gdb "print *lewd\n" +gdb_expect { + -re ".\[0-9\]* = 65 \'A\'.*$gdb_prompt $" { + pass "print value of *lewd" + } + -re ".*$gdb_prompt $" { fail "print value of *lewd" } + timeout { fail "(timeout) print value of *lewd" } + } + + +send_gdb "ptype lewd\n" +gdb_expect { + -re "type = const char \\* const.*$gdb_prompt $" { pass "ptype lewd" } + -re ".*$gdb_prompt $" { fail "ptype lewd" } + timeout { fail "(timeout) ptype lewd" } +} + + +send_gdb "print *lexicographer\n" +gdb_expect { + -re ".\[0-9\]* = 1 \'.001\'.*$gdb_prompt $" { + pass "print value of *lexicographer" + } + -re ".*$gdb_prompt $" { fail "print value of *lexicographer" } + timeout { fail "(timeout) print value of *lexicographer" } + } + + +send_gdb "ptype lexicographer\n" +gdb_expect { + -re "type = const unsigned char \\* const.*$gdb_prompt $" { pass "ptype lexicographer" } + -re ".*$gdb_prompt $" { fail "ptype lexicographer" } + timeout { fail "(timeout) ptype lexicographer" } +} + + +send_gdb "print *lexicon\n" +gdb_expect { + -re ".\[0-9\]* = 2.*$gdb_prompt $" { + pass "print value of *lexicon" + } + -re ".*$gdb_prompt $" { fail "print value of *lexicon" } + timeout { fail "(timeout) print value of *lexicon" } + } + + +send_gdb "ptype lexicon\n" +gdb_expect { + -re "type = const short \\* const.*$gdb_prompt $" { pass "ptype lexicon" } + -re ".*$gdb_prompt $" { fail "ptype lexicon" } + timeout { fail "(timeout) ptype lexicon" } +} + + +send_gdb "print *liaison\n" +gdb_expect { + -re ".\[0-9\]* = 3.*$gdb_prompt $" { + pass "print value of *liaison" + } + -re ".*$gdb_prompt $" { fail "print value of *liaison" } + timeout { fail "(timeout) print value of *liaison" } + } + + +send_gdb "ptype liaison\n" +gdb_expect { + -re "type = const unsigned short \\* const.*$gdb_prompt $" { pass "ptype liaison" } + -re ".*$gdb_prompt $" { fail "ptype liaison" } + timeout { fail "(timeout) ptype liaison" } +} + + +send_gdb "print *libation\n" +gdb_expect { + -re ".\[0-9\]* = 4.*$gdb_prompt $" { + pass "print value of *libation" + } + -re ".*$gdb_prompt $" { fail "print value of *libation" } + timeout { fail "(timeout) print value of *libation" } + } + + +send_gdb "ptype libation\n" +gdb_expect { + -re "type = const long \\* const.*$gdb_prompt $" { pass "ptype libation" } + -re ".*$gdb_prompt $" { fail "ptype libation" } + timeout { fail "(timeout) ptype libation" } +} + + +send_gdb "print *libelous\n" +gdb_expect { + -re ".\[0-9\]* = 5.*$gdb_prompt $" { + pass "print value of *libelous" + } + -re ".*$gdb_prompt $" { fail "print value of *libelous" } + timeout { fail "(timeout) print value of *libelous" } + } + + +send_gdb "ptype libelous\n" +gdb_expect { + -re "type = const unsigned long \\* const.*$gdb_prompt $" { pass "ptype libelous" } + -re ".*$gdb_prompt $" { fail "ptype libelous" } + timeout { fail "(timeout) ptype libelous" } +} + + +send_gdb "print *libertine\n" +gdb_expect { + -re ".\[0-9\]* = 6.*$gdb_prompt $" { + pass "print value of *libertine" + } + -re ".*$gdb_prompt $" { fail "print value of *libertine" } + timeout { fail "(timeout) print value of *libertine" } + } + + +send_gdb "ptype libertine\n" +gdb_expect { + -re "type = const float \\* const.*$gdb_prompt $" { pass "ptype libertine" } + -re ".*$gdb_prompt $" { fail "ptype libertine" } + timeout { fail "(timeout) ptype libertine" } +} + + +send_gdb "print *libidinous\n" +gdb_expect { + -re ".\[0-9\]* = 7.*$gdb_prompt $" { + pass "print value of *libidinous" + } + -re ".*$gdb_prompt $" { fail "print value of *libidinous" } + timeout { fail "(timeout) print value of *libidinous" } + } + + +send_gdb "ptype libidinous\n" +gdb_expect { + -re "type = const double \\* const.*$gdb_prompt $" { pass "ptype libidinous" } + -re ".*$gdb_prompt $" { fail "ptype libidinous" } + timeout { fail "(timeout) ptype libidinous" } +} + + +send_gdb "print *languish\n" +gdb_expect { + -re ".\[0-9\]* = 65 \'A\'.*$gdb_prompt $" { + pass "print value of *languish" + } + -re ".*$gdb_prompt $" { fail "print value of *languish" } + timeout { fail "(timeout) print value of *languish" } + } + + +send_gdb "ptype languish\n" +gdb_expect { + -re "type = const char \\*.*$gdb_prompt $" { pass "ptype languish" } + -re ".*$gdb_prompt $" { fail "ptype languish" } + timeout { fail "(timeout) ptype languish" } +} + + +send_gdb "print *languor\n" +gdb_expect { + -re ".\[0-9\]* = 1 \'.001\'.*$gdb_prompt $" { + pass "print value of *languor" + } + -re ".*$gdb_prompt $" { fail "print value of *languor" } + timeout { fail "(timeout) print value of *languor" } + } + + +send_gdb "ptype languor\n" +gdb_expect { + -re "type = const unsigned char \\*.*$gdb_prompt $" { pass "ptype languor" } + -re ".*$gdb_prompt $" { fail "ptype languor" } + timeout { fail "(timeout) ptype languor" } +} + + +send_gdb "print *lank\n" +gdb_expect { + -re ".\[0-9\]* = 2.*.*$gdb_prompt $" { + pass "print value of *lank" + } + -re ".*$gdb_prompt $" { fail "print value of *lank" } + timeout { fail "(timeout) print value of *lank" } + } + + +send_gdb "ptype lank\n" +gdb_expect { + -re "type = const short \\*.*$gdb_prompt $" { pass "ptype lank" } + -re ".*$gdb_prompt $" { fail "ptype lank" } + timeout { fail "(timeout) ptype lank" } +} + + +send_gdb "print *lapidary\n" +gdb_expect { + -re ".\[0-9\]* = 3.*$gdb_prompt $" { + pass "print value of *lapidary" + } + -re ".*$gdb_prompt $" { fail "print value of *lapidary" } + timeout { fail "(timeout) print value of *lapidary" } + } + + +send_gdb "ptype lapidary\n" +gdb_expect { + -re "type = const unsigned short \\*.*$gdb_prompt $" { pass "ptype lapidary" } + -re ".*$gdb_prompt $" { fail "ptype lapidary" } + timeout { fail "(timeout) ptype lapidary" } +} + + +send_gdb "print *larceny\n" +gdb_expect { + -re ".\[0-9\]* = 4.*$gdb_prompt $" { + pass "print value of *larceny" + } + -re ".*$gdb_prompt $" { fail "print value of *larceny" } + timeout { fail "(timeout) print value of *larceny" } + } + + +send_gdb "ptype larceny\n" +gdb_expect { + -re "type = const long \\*.*$gdb_prompt $" { pass "ptype larceny" } + -re ".*$gdb_prompt $" { fail "ptype larceny" } + timeout { fail "(timeout) ptype larceny" } +} + + +send_gdb "print *largess\n" +gdb_expect { + -re ".\[0-9\]* = 5.*$gdb_prompt $" { + pass "print value of *largess" + } + -re ".*$gdb_prompt $" { fail "print value of *largess" } + timeout { fail "(timeout) print value of *largess" } + } + + +send_gdb "ptype largess\n" +gdb_expect { + -re "type = const unsigned long \\*.*$gdb_prompt $" { pass "ptype largess" } + -re ".*$gdb_prompt $" { fail "ptype largess" } + timeout { fail "(timeout) ptype largess" } +} + + +send_gdb "print *lascivious\n" +gdb_expect { + -re ".\[0-9\]* = 6.*$gdb_prompt $" { + pass "print value of *lascivious" + } + -re ".*$gdb_prompt $" { fail "print value of *lascivious" } + timeout { fail "(timeout) print value of *lascivious" } + } + + +send_gdb "ptype lascivious\n" +gdb_expect { + -re "type = const float \\*.*$gdb_prompt $" { pass "ptype lascivious" } + -re ".*$gdb_prompt $" { fail "ptype lascivious" } + timeout { fail "(timeout) ptype lascivious" } +} + + +send_gdb "print *lassitude\n" +gdb_expect { + -re ".\[0-9\]* = 7.*$gdb_prompt $" { + pass "print value of *lassitude" + } + -re ".*$gdb_prompt $" { fail "print value of *lassitude" } + timeout { fail "(timeout) print value of *lassitude" } + } + + +send_gdb "ptype lassitude\n" +gdb_expect { + -re "type = const double \\*.*$gdb_prompt $" { pass "ptype lassitude" } + -re ".*$gdb_prompt $" { fail "ptype lassitude" } + timeout { fail "(timeout) ptype lassitude" } +} + + +send_gdb "print *lamprey\n" +gdb_expect { + -re ".\[0-9\]* = 66 \'B\'.*$gdb_prompt $" { + pass "print value of *lamprey" + } + -re ".*$gdb_prompt $" { fail "print value of *lamprey" } + timeout { fail "(timeout) print value of *lamprey" } + } + + +send_gdb "ptype lamprey\n" +gdb_expect { + -re "type = char \\* const.*$gdb_prompt $" { pass "ptype lamprey" } + -re ".*$gdb_prompt $" { fail "ptype lamprey" } + timeout { fail "(timeout) ptype lamprey" } +} + +send_gdb "print *lariat\n" +gdb_expect { + -re ".\[0-9\]* = 10 \'\\\\n\'.*$gdb_prompt $" { + pass "print value of *lariat" + } + -re ".*$gdb_prompt $" { fail "print value of *lariat" } + timeout { fail "(timeout) print value of *lariat" } + } + + +send_gdb "ptype lariat\n" +gdb_expect { + -re "type = unsigned char \\* const.*$gdb_prompt $" { pass "ptype lariat" } + -re ".*$gdb_prompt $" { fail "ptype lariat" } + timeout { fail "(timeout) ptype lariat" } +} + +send_gdb "print *laudanum\n" +gdb_expect { + -re ".\[0-9\]* = 20.*$gdb_prompt $" { + pass "print value of *laudanum" + } + -re ".*$gdb_prompt $" { fail "print value of *laudanum" } + timeout { fail "(timeout) print value of *laudanum" } + } + + +send_gdb "ptype laudanum\n" +gdb_expect { + -re "type = short \\* const.*$gdb_prompt $" { pass "ptype laudanum" } + -re ".*$gdb_prompt $" { fail "ptype laudanum" } + timeout { fail "(timeout) ptype laudanum" } +} + +send_gdb "print *lecithin\n" +gdb_expect { + -re ".\[0-9\]* = 30.*$gdb_prompt $" { + pass "print value of *lecithin" + } + -re ".*$gdb_prompt $" { fail "print value of *lecithin" } + timeout { fail "(timeout) print value of *lecithin" } + } + + +send_gdb "ptype lecithin\n" +gdb_expect { + -re "type = unsigned short \\* const.*$gdb_prompt $" { pass "ptype lecithin" } + -re ".*$gdb_prompt $" { fail "ptype lecithin" } + timeout { fail "(timeout) ptype lecithin" } +} + +send_gdb "print *leviathan\n" +gdb_expect { + -re ".\[0-9\]* = 40.*$gdb_prompt $" { + pass "print value of *leviathan" + } + -re ".*$gdb_prompt $" { fail "print value of *leviathan" } + timeout { fail "(timeout) print value of *leviathan" } + } + + +send_gdb "ptype leviathan\n" +gdb_expect { + -re "type = long \\* const.*$gdb_prompt $" { pass "ptype leviathan" } + -re ".*$gdb_prompt $" { fail "ptype leviathan" } + timeout { fail "(timeout) ptype leviathan" } +} + +send_gdb "print *libretto\n" +gdb_expect { + -re ".\[0-9\]* = 50.*$gdb_prompt $" { + pass "print value of *libretto" + } + -re ".*$gdb_prompt $" { fail "print value of *libretto" } + timeout { fail "(timeout) print value of *libretto" } + } + + +send_gdb "ptype libretto\n" +gdb_expect { + -re "type = unsigned long \\* const.*$gdb_prompt $" { pass "ptype libretto" } + -re ".*$gdb_prompt $" { fail "ptype libretto" } + timeout { fail "(timeout) ptype libretto" } +} + + +send_gdb "print *lissome\n" +gdb_expect { + -re ".\[0-9\]* = 60.*$gdb_prompt $" { + pass "print value of *lissome" + } + -re ".*$gdb_prompt $" { fail "print value of *lissome" } + timeout { fail "(timeout) print value of *lissome" } + } + + +send_gdb "ptype lissome\n" +gdb_expect { + -re "type = float \\* const.*$gdb_prompt $" { pass "ptype lissome" } + -re ".*$gdb_prompt $" { fail "ptype lissome" } + timeout { fail "(timeout) ptype lissome" } +} + +send_gdb "print *locust\n" +gdb_expect { + -re ".\[0-9\]* = 70.*$gdb_prompt $" { + pass "print value of *locust" + } + -re ".*$gdb_prompt $" { fail "print value of *locust" } + timeout { fail "(timeout) print value of *locust" } + } + + +send_gdb "ptype locust\n" +gdb_expect { + -re "type = double \\* const.*$gdb_prompt $" { pass "ptype locust" } + -re ".*$gdb_prompt $" { fail "ptype locust" } + timeout { fail "(timeout) ptype locust" } +} + +send_gdb "ptype radiation\n" +gdb_expect { + -re "type = const char &.*$gdb_prompt $" { pass "ptype radiation" } + -re ".*$gdb_prompt $" { fail "ptype radiation" } + timeout { fail "(timeout) ptype radiation" } +} + diff --git a/gdb/testsuite/gdb.base/environment.exp b/gdb/testsuite/gdb.base/environ.exp similarity index 100% rename from gdb/testsuite/gdb.base/environment.exp rename to gdb/testsuite/gdb.base/environ.exp diff --git a/gdb/testsuite/gdb.base/smoke.cc b/gdb/testsuite/gdb.base/smoke.cc new file mode 100644 index 0000000000..931fdaf061 --- /dev/null +++ b/gdb/testsuite/gdb.base/smoke.cc @@ -0,0 +1,480 @@ +// Test various -*- C++ -*- things. + +typedef struct fleep fleep; +struct fleep { int a; } s; + +// ====================== simple class structures ======================= + +struct default_public_struct { + // defaults to public: + int a; + int b; +}; + +struct explicit_public_struct { + public: + int a; + int b; +}; + +struct protected_struct { + protected: + int a; + int b; +}; + +struct private_struct { + private: + int a; + int b; +}; + +struct mixed_protection_struct { + public: + int a; + int b; + private: + int c; + int d; + protected: + int e; + int f; + public: + int g; + private: + int h; + protected: + int i; +}; + +class public_class { + public: + int a; + int b; +}; + +class protected_class { + protected: + int a; + int b; +}; + +class default_private_class { + // defaults to private: + int a; + int b; +}; + +class explicit_private_class { + private: + int a; + int b; +}; + +class mixed_protection_class { + public: + int a; + int b; + private: + int c; + int d; + protected: + int e; + int f; + public: + int g; + private: + int h; + protected: + int i; +}; + +// ========================= simple inheritance ========================== + +class A { + public: + int a; + int x; +}; + +A g_A; + +class B : public A { + public: + int b; + int x; +}; + +B g_B; + +class C : public A { + public: + int c; + int x; +}; + +C g_C; + +class D : public B, public C { + public: + int d; + int x; +}; + +D g_D; + +class E : public D { + public: + int e; + int x; +}; + +E g_E; + +class class_with_anon_union +{ + public: + int one; + union + { + int a; + long b; + }; +}; + +class_with_anon_union g_anon_union; + +void inheritance2 (void) +{ +} + +void inheritance1 (void) +{ + int ival; + int *intp; + + // {A::a, A::x} + + g_A.A::a = 1; + g_A.A::x = 2; + + // {{A::a,A::x},B::b,B::x} + + g_B.A::a = 3; + g_B.A::x = 4; + g_B.B::b = 5; + g_B.B::x = 6; + + // {{A::a,A::x},C::c,C::x} + + g_C.A::a = 7; + g_C.A::x = 8; + g_C.C::c = 9; + g_C.C::x = 10; + + // {{{A::a,A::x},B::b,B::x},{{A::a,A::x},C::c,C::x},D::d,D::x} + + // The following initialization code is non-portable, but allows us + // to initialize all members of g_D until we can fill in the missing + // initialization code with legal C++ code. + + for (intp = (int *) &g_D, ival = 11; + intp < ((int *) &g_D + sizeof (g_D) / sizeof (int)); + intp++, ival++) + { + *intp = ival; + } + + // Overlay the nonportable initialization with legal initialization. + + // ????? = 11; (g_D.A::a = 11; is ambiguous) + // ????? = 12; (g_D.A::x = 12; is ambiguous) + g_D.B::b = 13; + g_D.B::x = 14; + // ????? = 15; + // ????? = 16; + g_D.C::c = 17; + g_D.C::x = 18; + g_D.D::d = 19; + g_D.D::x = 20; + + + // {{{{A::a,A::x},B::b,B::x},{{A::a,A::x},C::c,C::x},D::d,D::x}},E::e,E::x} + + // The following initialization code is non-portable, but allows us + // to initialize all members of g_D until we can fill in the missing + // initialization code with legal C++ code. + + for (intp = (int *) &g_E, ival = 21; + intp < ((int *) &g_E + sizeof (g_E) / sizeof (int)); + intp++, ival++) + { + *intp = ival; + } + + // Overlay the nonportable initialization with legal initialization. + + // ????? = 21; (g_E.A::a = 21; is ambiguous) + // ????? = 22; (g_E.A::x = 22; is ambiguous) + g_E.B::b = 23; + g_E.B::x = 24; + // ????? = 25; + // ????? = 26; + g_E.C::c = 27; + g_E.C::x = 28; + g_E.D::d = 29; + g_E.D::x = 30; + g_E.E::e = 31; + g_E.E::x = 32; + + g_anon_union.one = 1; + g_anon_union.a = 2; + + inheritance2 (); +} + +// ======================== virtual base classes========================= + +class vA { + public: + int va; + int vx; +}; + +vA g_vA; + +class vB : public virtual vA { + public: + int vb; + int vx; +}; + +vB g_vB; + +class vC : public virtual vA { + public: + int vc; + int vx; +}; + +vC g_vC; + +class vD : public virtual vB, public virtual vC { + public: + int vd; + int vx; +}; + +vD g_vD; + +class vE : public virtual vD { + public: + int ve; + int vx; +}; + +vE g_vE; + +void inheritance4 (void) +{ +} + +void inheritance3 (void) +{ + int ival; + int *intp; + + // {vA::va, vA::vx} + + g_vA.vA::va = 1; + g_vA.vA::vx = 2; + + // {{vA::va, vA::vx}, vB::vb, vB::vx} + + g_vB.vA::va = 3; + g_vB.vA::vx = 4; + g_vB.vB::vb = 5; + g_vB.vB::vx = 6; + + // {{vA::va, vA::vx}, vC::vc, vC::vx} + + g_vC.vA::va = 7; + g_vC.vA::vx = 8; + g_vC.vC::vc = 9; + g_vC.vC::vx = 10; + + // {{{{vA::va, vA::vx}, vB::vb, vB::vx}, vC::vc, vC::vx}, vD::vd,vD::vx} + + g_vD.vA::va = 11; + g_vD.vA::vx = 12; + g_vD.vB::vb = 13; + g_vD.vB::vx = 14; + g_vD.vC::vc = 15; + g_vD.vC::vx = 16; + g_vD.vD::vd = 17; + g_vD.vD::vx = 18; + + + // {{{{{vA::va,vA::vx},vB::vb,vB::vx},vC::vc,vC::vx},vD::vd,vD::vx},vE::ve,vE::vx} + + g_vD.vA::va = 19; + g_vD.vA::vx = 20; + g_vD.vB::vb = 21; + g_vD.vB::vx = 22; + g_vD.vC::vc = 23; + g_vD.vC::vx = 24; + g_vD.vD::vd = 25; + g_vD.vD::vx = 26; + g_vE.vE::ve = 27; + g_vE.vE::vx = 28; + + inheritance4 (); +} + +// ====================================================================== + +class Base1 { + public: + int x; + Base1(int i) { x = i; } +}; + +class Foo +{ + public: + int x; + int y; + static int st; + Foo (int i, int j) { x = i; y = j; } + int operator! (); + operator int (); + int times (int y); +}; + +class Bar : public Base1, public Foo { + public: + int z; + Bar (int i, int j, int k) : Base1 (10*k), Foo (i, j) { z = k; } +}; + +int Foo::operator! () { return !x; } + +int Foo::times (int y) { return x * y; } + +int Foo::st = 100; + +Foo::operator int() { return x; } + +Foo foo(10, 11); +Bar bar(20, 21, 22); + +class Contains_static_instance +{ + public: + int x; + int y; + Contains_static_instance (int i, int j) { x = i; y = j; } + static Contains_static_instance null; +}; + +Contains_static_instance Contains_static_instance::null(0,0); +Contains_static_instance csi(10,20); + +class Contains_nested_static_instance +{ + public: + class Nested + { + public: + Nested(int i) : z(i) {} + int z; + static Contains_nested_static_instance xx; + }; + + Contains_nested_static_instance(int i, int j) : x(i), y(j) {} + + int x; + int y; + + static Contains_nested_static_instance null; + static Nested yy; +}; + +Contains_nested_static_instance Contains_nested_static_instance::null(0, 0); +Contains_nested_static_instance::Nested Contains_nested_static_instance::yy(5); +Contains_nested_static_instance + Contains_nested_static_instance::Nested::xx(1,2); +Contains_nested_static_instance cnsi(30,40); + +typedef struct { + int one; + int two; +} tagless_struct; +tagless_struct v_tagless; + +/* Try to get the compiler to allocate a class in a register. */ +class small { + public: + int x; + int method (); +}; +int small::method () +{ + return x + 5; +} +void marker_reg1 () {} + +int +register_class () +{ + /* We don't call any methods for v, so gcc version cygnus-2.3.3-930220 + might put this variable in a register. This is a lose, though, because + it means that GDB can't call any methods for that variable. */ + register small v; + + int i; + + /* Perform a computation sufficiently complicated that optimizing compilers + won't optimized out the variable. If some compiler constant-folds this + whole loop, maybe using a parameter to this function here would help. */ + v.x = 0; + for (i = 0; i < 13; ++i) + v.x += i; + --v.x; /* v.x is now 77 */ + marker_reg1 (); + return v.x + 5; +} + +int +main() +{ +#ifdef usestubs + set_debug_traps(); + breakpoint(); +#endif + inheritance1 (); + inheritance3 (); + register_class (); + + /* FIXME: pmi gets optimized out. Need to do some more computation with + it or something. (No one notices, because the test is xfail'd anyway, + but that probably won't always be true...). */ + int Foo::* pmi = &Foo::y; + + /* Make sure the AIX linker doesn't remove the variable. */ + v_tagless.one = 5; + + return foo.*pmi; +} + +/* Create an instance for some classes, otherwise they get optimized away. */ +default_public_struct default_public_s; +explicit_public_struct explicit_public_s; +protected_struct protected_s; +private_struct private_s; +mixed_protection_struct mixed_protection_s; +public_class public_c; +protected_class protected_c; +default_private_class default_private_c; +explicit_private_class explicit_private_c; +mixed_protection_class mixed_protection_c;