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

# 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++}] != "" } {
     gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail."
}

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

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 ".*$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
    }
}
