# Copyright 1998-2004, 2007-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/>.

# 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\]+"

#
# test running programs
#

if { [skip_cplus_tests] } { continue }

standard_testfile .cc

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

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

#
# 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"

set eol "\[\t \]*\[\r\n\]+\[\t \]*"
gdb_test_multiple "ptype Local" "Local out of scope" {
    -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"
    }
}
        

# 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

gdb_test_multiple "ptype InnerLocal" "ptype InnerLocal" {
    -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)"
    }
}

#---
# 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.

gdb_test_multiple "ptype NestedInnerLocal" "ptype NestedInnerLocal" {
    -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"
    }
}

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
    }
}
