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

# Please email any bugs, comments, and/or additions to this file to:
# bug-gdb@prep.ai.mit.edu

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

# Local classes in g++ get names like "main.1::InnerLocal", just like local
# static variables.  Some targets use "___" instead of ".".

# ---
# Pattern 1:
# PASS
#   dwarf-2
#     gcc 2.95.3
#
# Pattern 2:
# FAIL
# This has a duplicate "char loc_foo" line.  This is a bug.
# Historically this has been an XFAIL.
#   dwarf-2
#     gcc 2.96-rh, 3.0.4, gcc-3_1-branch, HEAD
#
# Pattern 3:
# PASS
#   stabs+
#     gcc 2.95.3, 2.96-rh, 3.0.4, gcc-3_1-branch, HEAD
#
# Pattern 4:
# This an old pattern from the hppa aCC version of this file.
# I left it alone.
#
# chastain 2002-04-08

# pattern #5
# PASS
#   stabs+
#     gcc HEAD abi-2
#
# chastain 2004-01-02

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

send_gdb "ptype Local\n"
gdb_expect {
  -re "type = class Local \{\[\r\n\t \]*public:\[\r\n\t \]*int loc1;\[\r\n\t \]*char loc_foo\\((const *|)char\\);\[\r\n\t \]*\}.*$gdb_prompt $" { pass "ptype Local" }
  -re "type = class Local \{\[\r\n\t \]*public:\[\r\n\t \]*int loc1;\[\r\n\t \]*char loc_foo\\((const *|)char\\);\[\r\n\t \]*char loc_foo\\((const *|)char\\);\[\r\n\t \]*\}.*$gdb_prompt $" {
    kfail "gdb/483" "ptype Local"
  }
  -re "type = class Local \{\[\r\n\t \]*public:\[\r\n\t \]*int loc1;\[\r\n\t \]*Local & operator *=\\((foobar__Fi${sep}::|)Local const *&\\);\[\r\n\t \]*Local\\((foobar__Fi${sep}::|)Local const *&\\);\[\r\n\t \]*Local\\((void|)\\);\[\r\n\t \]*char loc_foo\\(char\\);\[\r\n\t \]*\}.*$gdb_prompt $" { pass "ptype Local" }
  -re "type = class Local \{\r\n\[\t \]*public:\r\n\[\t \]*int loc1;\r\n\r\n\[\t \]*char loc_foo\\(char\\);\r\n\[\t \]*\\(Local at.*local\\.cc:\[0-9\]*\\)\r\n\}.*$gdb_prompt $" { xpass "ptype Local (old aCC)" }
  -re "type = class Local \{\[\r\n\t \]*public:\[\r\n\t \]*int loc1;\[\r\n\t \]*char loc_foo\\(char\\);\[\r\n\t \]*Local & operator *=\\((foobar__Fi${sep}::|)Local const *&\\);\[\r\n\t \]*Local\\((foobar__Fi${sep}::|)Local const *&\\);\[\r\n\t \]*Local\\((void|)\\);\[\r\n\t \]*\}.*$gdb_prompt $" { pass "ptype Local" }
  -re ".*$gdb_prompt $"   {  fail "ptype Local" }
  timeout             { fail "(timeout) ptype Local" }
}

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