# Copyright 2008, 2011-2012 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 .cc

if { [prepare_for_testing ${testfile}.exp ${testfile} ${srcfile} {debug c++}] } {
     return -1
}

############################################

if ![runto_main] then {
    perror "couldn't run to breakpoint main"
    continue
}

gdb_breakpoint [gdb_get_line_number "end of main"]
gdb_continue_to_breakpoint "end of main"

gdb_test "p foo0_1 (ta)"   "= 1"              "typedef to another typedef"
gdb_test "p foo0_2 (ta)"   "= 2"              "typedef to typedef of a typedef"
gdb_test "p foo0_3 (bppp)" "Cannot resolve.*" \
 "Pointer-to-pointer-to-pointer derived to Pointer-to-pointer-to-pointer base."

gdb_test "p foo1_1 (a)"  "= 11"             "pointer to pointer"
gdb_test "p foo1_2 (a)"  "= 12"             "pointer to array"
gdb_test "p foo1_3 (a)"  "Cannot resolve.*" "pointer to pointer of wrong type"
gdb_test "p foo1_3 (bp)" "Cannot resolve.*" "pointer to pointer of wrong type"
gdb_test "p foo1_4 (bp)" "= 14"             "pointer to ancestor pointer"
gdb_test "p foo1_5 (bp)" "= 15"             "pointer to void pointer"
gdb_test "p foo1_6 (bp)" "Cannot resolve.*"     "pointer to void pointer pointer"
gdb_test "p foo1_7 (bp)" "= 17"                 "pointer to boolean"
gdb_test "p foo1_8 (bp)" "Using non-standard.*" "pointer to long int"

gdb_test "p foo1_5 (b)" "= 15"             "pointer pointer to void pointer"
gdb_test "p foo2_1 (b)" "= 21"             "pointer pointer to pointer pointer"
gdb_test "p foo2_2 (b)" "Cannot resolve.*" "pointer pointer to array of arrays"
gdb_test "p foo2_3 (b)" "= 23"             "pointer pointer to array of pointers"
gdb_test "p foo2_4 (b)" "Cannot resolve.*" "pointer pointer to array of wrong pointers"

gdb_test "p foo3_1 ((char *) 0, ta)" "Cannot resolve.*" \
    "check all parameters for badness"

# Tests for null pointer conversion
global gdb_prompt
set nl {[\r\n]+}
set t "null pointer conversion"
gdb_test_multiple "p foo3_1 (0, 0)" $t {
  -re "warning: Using non-standard conversion.*$nl$gdb_prompt $" {
    fail "$t (warning issued)"
  }

  -re "Cannot resolve function foo3_1 to any overloaded instance$nl$gdb_prompt $" {
    fail "$t (conversion failed)"
  }

  -re "\\$\[0-9\]+ = 31$nl$gdb_prompt $" {
    pass $t
  }
}
gdb_test "p foo3_1 (0, 1)" \
    "Cannot resolve function foo3_1 to any overloaded instance"
gdb_test "p foo3_1 (0, (const char**) 1)" " = 31"
gdb_test "p foo3_2 (0, 0)" "= 32"
gdb_test "p foo3_2 (0, (char const**) 0)" " = 320"

