# Copyright 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2007, 2008
# 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/>.

# tests for local variables
# Written by Satish Pai <pai@apollo.hp.com> 1997-07-08
# Cleaned by Michael Chastain <mec@shout.net> 2002-04-08


# This file is part of the gdb testsuite

set ws "\[\r\n\t \]+"
set nl "\[\r\n\]+"

if $tracelevel then {
        strace $tracelevel
        }

#
# test running programs
#
set prms_id 0
set bug_id 0

if { [skip_cplus_tests] } { continue }

set testfile "local"
set srcfile ${testfile}.cc
set binfile ${objdir}/${subdir}/${testfile}

if  { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug c++}] != "" } {
     untested local.exp
     return -1
}

if [get_compiler_info $binfile "c++"] {
  return -1
}

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
}

if ![runto 'marker1'] then {
    perror "couldn't run to marker1"
    continue
}

gdb_test "up" ".*foobar.*" "up from marker1"

set sep "(\[.\]|___)\[0-9\]"

# ptype on a local variable.
#
# This test has six arms.  The first three arms accept normal output:
# no synthetic methods; synthetic methods before user methods;
# synthetic methods after user methods.
#
# The next two arms accept "foobar__Fi.0::Local" instead of "Local".
# This is a bug.  It happens in various places with various versions of
# gcc and gdb and various debugging types.
#
# The last arm accepts the user methods in duplicate.  This bug happens
# with gcc 3.3.2 -gdwarf-2, and has been fixed in gcc HEAD 2004-01-22.
#
# -- chastain 2004-01-24

set re_class		"((struct|class) Local \{${ws}public:|struct Local \{)"
set re_fields		"int loc1;"
set re_methods		"char loc_foo\\(char\\);"
set re_synth_gcc_23	"Local & operator=\\(Local const ?&\\);${ws}Local\\(Local const ?&\\);${ws}Local\\((void|)\\);"

set XX_class		"((struct|class) foobar__Fi.0::Local \{${ws}public:|struct foobar__Fi.0:Local \{)"
set XX_synth_gcc_2	"Local & operator=\\(foobar__Fi.0::Local const ?&\\);${ws}Local\\(foobar__Fi.0::Local const ?&\\);${ws}Local\\((void|)\\);"
set YY_methods		"$re_methods${ws}$re_methods"

set name "ptype l"
gdb_test_multiple "ptype l" $name {
    -re "type = $re_class${ws}$re_fields${ws}$re_methods$nl\}$nl$gdb_prompt $" {
	# gdb 6.0, gcc 2.95.3, dwarf-2
	# gdb 6.0, gcc HEAD 2004-01-22, dwarf-2
	# gdb HEAD 2004-01-23, gcc HEAD 2004-01,22, dwarf-2
	pass "$name"
    }
    -re "type = $re_class${ws}$re_fields${ws}$re_synth_gcc_23${ws}$re_methods$nl\}$nl$gdb_prompt $" {
	# gdb 6.0, gcc 3.3.2, stabs+
	# gdb HEAD 2004-01-23, gcc 3.3.2, stabs+
	pass "$name"
    }
    -re "type = $re_class${ws}$re_fields${ws}$re_methods${ws}$re_synth_gcc_23${ws}$nl\}$nl$gdb_prompt $" {
	# gdb 6.0, gcc HEAD 2004-01-22, stabs+
	# gdb HEAD 2004-01-23, gcc HEAD 2004-01-22, stabs+
	pass "$name"
    }
    -re "type = $XX_class${ws}$re_fields${ws}$re_methods$nl\}$nl$gdb_prompt $" {
	# gdb HEAD 2004-01-23, gcc 2.95.3, dwarf-2
	kfail "gdb/1516" "$name"
    }
    -re "type = ($re_class|$XX_class)${ws}$re_fields${ws}($re_synth_gcc_23|$XX_synth_gcc_2)${ws}$re_methods$nl\}$nl$gdb_prompt $" {
	# gdb 6.0, gcc 2.95.3, stabs+
	# gdb HEAD 2004-01-23, gcc 2.95.3, stabs+
	kfail "gdb/1516" "$name"
    }
    -re "type = ($re_class|$XX_class)${ws}$re_fields${ws}$YY_methods$nl\}$nl$gdb_prompt $" {
	# gdb 6.0, gcc 3.3.2, dwarf-2
	# gdb HEAD 2004-01-23, gcc 3.2.2, dwarf-2
	kfail "gdb/483" "$name"
    }
}

# This is the same test with "ptype Local" (the type name)
# instead of "ptype l" (the variable name).

set name "ptype Local"
gdb_test_multiple "ptype Local" $name {
    -re "type = $re_class${ws}$re_fields${ws}$re_methods$nl\}$nl$gdb_prompt $" {
	# gdb 6.0, gcc 2.95.3, dwarf-2
	# gdb 6.0, gcc HEAD 2004-01-22, dwarf-2
	# gdb HEAD 2004-01-23, gcc HEAD 2004-01-22, dwarf-2
	pass "$name"
    }
    -re "type = $re_class${ws}$re_fields${ws}$re_synth_gcc_23${ws}$re_methods$nl\}$nl$gdb_prompt $" {
	# gdb 6.0, gcc 3.3.2, stabs+
	# gdb HEAD 2004-01-23, gcc 3.3.2, stabs+
	pass "$name"
    }
    -re "type = $re_class${ws}$re_fields${ws}$re_methods${ws}$re_synth_gcc_23${ws}$nl\}$nl$gdb_prompt $" {
	# gdb 6.0, gcc HEAD 2004-01-22, stabs+
	# gdb HEAD 2004-01-23, gcc HEAD 2004-01-22, stabs+
	pass "$name"
    }
    -re "type = $XX_class${ws}$re_fields${ws}$re_methods$nl\}$nl$gdb_prompt $" {
	kfail "gdb/1516" "$name"
    }
    -re "type = ($re_class|$XX_class)${ws}$re_fields${ws}($re_synth_gcc_23|$XX_synth_gcc_2)${ws}$re_methods$nl\}$nl$gdb_prompt $" {
	# gdb 6.0, gcc 2.95.3, stabs+
	# gdb HEAD 2004-01-23, gcc 2.95.3, stabs+
	kfail "gdb/1516" "$name"
    }
    -re "type = ($re_class|$XX_class)${ws}$re_fields${ws}$YY_methods$nl\}$nl$gdb_prompt $" {
	# gdb 6.0, gcc 3.3.2, dwarf-2
	# gdb HEAD 2004-01-23, gcc 3.2.2, dwarf-2
	kfail "gdb/483" "$name"
    }
    -re "No symbol \"Local\" in current context.$nl$gdb_prompt $" {
	# gdb HEAD 2004-01-23, gcc 2.95.3, dwarf-2
	fail "$name"
    }
}

gdb_test "break marker2"
gdb_test "continue" "Continuing\\..*Breakpoint \[0-9\]+, marker2.*" \
    "continuing to marker2"

gdb_test "up" ".*main.*" "up from marker2"

# Make sure that `Local' isn't in scope here; it's local to foobar.
# setup_kfail "gdb/825"
send_gdb "ptype Local\n"
set eol "\[\t \]*\[\r\n\]+\[\t \]*"
gdb_expect {
    -re "No symbol \"Local\" in current context.*${gdb_prompt} $" {
        pass "Local out of scope"
    }
    -re "ptype Local${eol}type = class Local {${eol}  public:${eol}    int loc1;${eol}.*${eol}    char loc_foo\\(char\\);${eol}}${eol}${gdb_prompt} " {
        # GCC emits STABS debugging information in a way that doesn't
        # properly preserve the scoping of local classes.  I think
        # we'd need to start using Sun's extensions to stabs to get
        # this right.
        kfail gdb/825 "Local out of scope"
    }
    -re "ptype Local${eol}type = class Local {${eol}  public:${eol}    int loc1;${eol}    char loc_foo\\(char\\);${eol}.*${eol}}${eol}${gdb_prompt} " {
	# gcc 3.X abi-2 -gstabs+
        kfail gdb/825 "Local out of scope"
    }
    -re ".*${gdb_prompt} $" {
        fail "Local out of scope"
    }
    timeout {
        fail "Local out of scope (timeout)"
    }
}
        

# DTS CLLbs14316 and CLLbs17058
# coulter - I added a clause for HP's aCC compiler.  We print out the type
#   as xx instead of const unsigned char, but we still have an expected failure
#   because of two reasons:
#   There is a number at the end of InnerLocal4 which should not be there,
#       DTS CLLbs14316
#   The line number for the class 
# setup_xfail "hppa*-*-*" CLLbs14316

# ---
# Pattern 1:
# PASS
#   dwarf-2
#     2.95.3, 2.96-rh, 3.0.4, 3.1, gcc-3_1-branch, HEAD
#
# Pattern 2:
# PASS
#   stabs+
#     2.95.3, 2.96-rh, 3.0.4, 3.1, gcc-3_1-branch, HEAD
#
# Pattern 3:
# Old hppa pattern.
#
# Pattern 4:
# Old hppa pattern.
#
# chastain 2002-05-27

# Pattern 5:
# PASS
#   stabs+
#     HEAD
#
# chastain 2004-01-02

send_gdb "ptype InnerLocal\n"
gdb_expect {
  -re "type = class InnerLocal \{\[\r\n\t \]*public:\[\r\n\t \]*char ilc;\[\r\n\t \]*int \\* *ip;\[\r\n\t \]*(InnerLocal::|)NestedInnerLocal nest1;\[\r\n\t \]*int il_foo\\((unsigned char const|const unsigned char) *&\\);\[\r\n\t \]*\}.*$gdb_prompt $" { pass "ptype InnerLocal (pattern 1)" }
  -re "type = class InnerLocal \{\[\r\n\t \]*public:\[\r\n\t \]*char ilc;\[\r\n\t \]*int \\* *ip;\[\r\n\t \]*(InnerLocal::|)NestedInnerLocal nest1;\[\r\n\t \]*InnerLocal *& operator *=\\((main${sep}::|)InnerLocal const *&\\);\[\r\n\t \]*InnerLocal\\((main${sep}::|)InnerLocal const *&\\);\[\r\n\t \]*InnerLocal\\((void|)\\);\[\r\n\t \]*int il_foo\\(unsigned char const *&\\);\[\r\n\t \]*\}.*$gdb_prompt $" { pass "ptype InnerLocal (pattern 2)" }
  -re "type = class InnerLocal \{\r\n\[\t \]*public:\r\n\[\t \]*char ilc;\r\n\[\t \]*int \\*ip;\r\n\[\t \]*InnerLocal::NestedInnerLocal nest1;\r\n\r\n\[\t \]*.int il_foo\\(unsigned char const &\\);\r\n\[\t \]*\}\[\t \]*\\(Local at.*local\\.cc:36\\).*$gdb_prompt $" { pass "ptype InnerLocal (old HP aCC)" }
  -re "type = class InnerLocal \{\r\n\[\t \]*public:\r\n\[\t \]*char ilc;\r\n\[\t \]*int \\*ip;\r\n\[\t \]*class InnerLocal4::NestedInnerLocal nest1;\r\n\r\n\[\t \]*int il_foo\\(unsigned char const &\\);\r\n\[\t \]*\\(Local at.*local\.cc:\[0-9\]+\\)\r\n\}.*$gdb_prompt $" { pass "ptype InnerLocal (old HP aCC)" }
  -re "type = class InnerLocal \{\[\r\n\t \]*public:\[\r\n\t \]*char ilc;\[\r\n\t \]*int \\* *ip;\[\r\n\t \]*(InnerLocal::|)NestedInnerLocal nest1;\[\r\n\t \]* int il_foo\\(unsigned char const *&\\);\[\r\n\t \]*InnerLocal *& operator *=\\((main${sep}::|)InnerLocal const *&\\);\[\r\n\t \]*InnerLocal\\((main${sep}::|)InnerLocal const *&\\);\[\r\n\t \]*InnerLocal\\((void|)\\);\[\r\n\t \]*\}.*$gdb_prompt $" { pass "ptype InnerLocal (pattern 5)" }
  -re ".*$gdb_prompt $"   {  fail "ptype InnerLocal" }
  timeout             { fail "(timeout) ptype InnerLocal" }
}

#---
# Pattern 1:
# PASS
#   dwarf-2
#     gcc 2.95.3, 2.96-rh, 3.0.4, gcc-3_1-branch, HEAD
#
# Pattern 2:
# PASS
#   stabs+
#     gcc 2.95.3, 2.96-rh, 3.0.4, gcc-3_1-branch, HEAD
#
# chastain 2002-04-08

# NOTE (2004-02-24, carlton): This test really is invalid -
# 'NestedInnerLocal' shouldn't be visible, so only the third
# expression should count as a pass.  I'm leaving in the earlier
# passes, however, given the current problematic state of our local
# class support, but once we fix PR gdb/482, we should delete this
# test.

send_gdb "ptype NestedInnerLocal\n"
gdb_expect {
  -re "type = class NestedInnerLocal \{\[\r\n\t \]*public:\[\r\n\t \]*int nil;\[\r\n\t \]*int nil_foo\\(int\\);\[\r\n\t \]*\}.*$gdb_prompt $" { pass "ptype NestedInnerLocal" }
  -re "type = class NestedInnerLocal \{\[\r\n\t \]*public:\[\r\n\t \]*int nil;\[\r\n\t \]*NestedInnerLocal *& *operator *= *\\((main${sep}::|)InnerLocal::NestedInnerLocal const *&\\);\[\r\n\t \]*NestedInnerLocal\\((main${sep}::|)InnerLocal::NestedInnerLocal const *&\\);\[\r\n\t \]*NestedInnerLocal\\((void|)\\);\[\r\n\t \]*int nil_foo\\(int\\);\[\r\n\t \]*\}.*$gdb_prompt $" { pass "ptype NestedInnerLocal" }
  -re "No symbol \"NestedInnerLocal\" in current context\.\r\n$gdb_prompt $" {
    pass "ptype NestedInnerLocal"
  }
  -re ".*$gdb_prompt $"   {  fail "ptype NestedInnerLocal" }
  timeout             { fail "(timeout) ptype NestedInnerLocal" }
}

set re_class		"((struct|class) InnerLocal::NestedInnerLocal \{${ws}public:|struct InnerLocal::NestedInnerLocal \{)"
set re_fields		"int nil;"
set re_methods		"int nil_foo\\(int\\);"
set re_synth_gcc_23	"InnerLocal::NestedInnerLocal & operator=\\(InnerLocal::NestedInnerLocal const ?&\\);${ws}NestedInnerLocal\\(InnerLocal::NestedInnerLocal const ?&\\);${ws}NestedInnerLocal\\(\\);"

set name "ptype InnerLocal::NestedInnerLocal"
gdb_test_multiple "ptype InnerLocal::NestedInnerLocal" $name {
    -re "type = $re_class${ws}$re_fields${ws}$re_methods$nl\}$nl$gdb_prompt $" {
	# gcc -gdwarf-2 should produce this but does not yet
	pass $name
    }
    -re "type = $re_class${ws}$re_fields${ws}$re_synth_gcc_23${ws}$re_methods${ws}$nl\}$nl$gdb_prompt $" {
	# gcc 2.95.3 -gstabs+
	# gcc v3 -gstabs+, abi 1
	pass $name
    }
    -re "type = $re_class${ws}$re_fields${ws}$re_methods${ws}$re_synth_gcc_23${ws}$nl\}$nl$gdb_prompt $" {
	# gcc v3 -gstabs+, abi 2
	pass $name
    }
    -re "There is no field named NestedInnerLocal.*$gdb_prompt $" {
	# gcc v3 -gdwarf-2
	kfail "gdb/482" $name
    }
}
