# Copyright 1998-2013 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
    }
}
