# This test code is part of GDB, the GNU debugger.

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

# Auxiliary function to check for known problems.
#
# EXPECTED_STRING is the string expected by the test.
#
# ACTUAL_STRING is the actual string output by gdb.
#
# ERRATA_TABLE is a list of lines of the form:
#
#  { expected-string broken-string {eval-block} }
#
# If there is a line for the given EXPECTED_STRING, and if the
# ACTUAL_STRING output by gdb is the same as the BROKEN_STRING in the
# table, then I eval the eval-block.

proc cp_check_errata { expected_string actual_string errata_table } {
    foreach erratum $errata_table {
	if { "$expected_string" == [lindex $erratum 0]
	&&   "$actual_string"   == [lindex $erratum 1] } then {
	    eval [lindex $erratum 2]
	}
    }
}

# Test ptype of a class.
#
# Different C++ compilers produce different output.  To accommodate all
# the variations listed below, I read the output of "ptype" and process
# each line, matching it to the class description given in the
# parameters.
#
# IN_COMMAND and IN_TESTNAME are the command and testname for
# gdb_test_multiple.  If IN_TESTNAME is the empty string, then it
# defaults to IN_COMMAND.
#
# IN_KEY is "class" or "struct".  For now, I ignore it, and allow either
# "class" or "struct" in the output, as long as the access specifiers all
# work out okay.
#
# IN_TAG is the class tag or structure tag.
#
# IN_CLASS_TABLE is a list of class information.  Each entry contains a
# keyword and some values.  The keywords and their values are:
#
#   { base "base-declaration" }
#
#      the class has a base with the given declaration.
#
#   { vbase "name" }
#
#      the class has a virtual base pointer with the given name.  this
#      is for gcc 2.95.3, which emits ptype entries for the virtual base
#      pointers.  the vbase list includes both indirect and direct
#      virtual base classes (indeed, a virtual base is usually
#      indirect), so this information cannot be derived from the base
#      declarations.
#
#   { field "access" "declaration" }
#
#      the class has a data field with the given access type and the
#      given declaration.
#
#   { method "access" "declaration" }
#
#      the class has a member function with the given access type
#      and the given declaration.
#
# If you test the same class declaration more than once, you can specify
# IN_CLASS_TABLE as "ibid".  "ibid" means: look for a previous class
# table that had the same IN_KEY and IN_TAG, and re-use that table.
#
# IN_TAIL is the expected text after the close brace, specifically the "*"
# in "struct { ... } *".  This is an optional parameter.  The default
# value is "", for no tail.
#
# IN_ERRATA_TABLE is a list of errata entries.  See cp_check_errata for the
# format of the errata table.  Note: the errata entries are not subject to
# demangler syntax adjustment, so you have to make a bigger table
# with lines for each output variation.
# 
# gdb can vary the output of ptype in several ways:
#
# . CLASS/STRUCT
#
#   The output can start with either "class" or "struct", depending on
#   what the symbol table reader in gdb decides.  This is usually
#   unrelated to the original source code.
#
#     dwarf-2  debug info distinguishes class/struct, but gdb ignores it
#     stabs+   debug info does not distinguish class/struct
#     hp       debug info distinguishes class/struct, and gdb honors it
#
#   I tried to accommodate this with regular expressions such as
#   "((class|struct) A \{ public:|struct A \{)", but that turns into a
#   hairy mess because of optional private virtual base pointers and
#   optional public synthetic operators.  This is the big reason I gave
#   up on regular expressions and started parsing the output.
#
# . REDUNDANT ACCESS SPECIFIER
#
#   In "class { private: ... }" or "struct { public: ... }", gdb might
#   or might not emit a redundant initial access specifier, depending
#   on the gcc version.
#
# . VIRTUAL BASE POINTERS
#
#   If a class has virtual bases, either direct or indirect, the class
#   will have virtual base pointers.  With gcc 2.95.3, gdb prints lines
#   for these virtual base pointers.  This does not happen with gcc
#   3.3.4, gcc 3.4.1, or hp acc A.03.45.
#
#   I accept these lines.  These lines are optional; but if I see one of
#   these lines, then I expect to see all of them.
#
#   Note: drow considers printing these lines to be a bug in gdb.
#
# . SYNTHETIC METHODS
#
#   A C++ compiler may synthesize some methods: an assignment
#   operator, a copy constructor, a constructor, and a destructor.  The
#   compiler might include debug information for these methods.
#
#     dwarf-2  gdb does not show these methods
#     stabs+   gdb shows these methods
#     hp       gdb does not show these methods
#
#   I accept these methods.  These lines are optional, and any or
#   all of them might appear, mixed in anywhere in the regular methods.
#
#   With gcc v2, the synthetic copy-ctor and ctor have an additional
#   "int" parameter at the beginning, the "in-charge" flag.
#
# . DEMANGLER SYNTAX VARIATIONS
#
#   Different demanglers produce "int foo(void)" versus "int foo()",
#   "const A&" versus "const A &", and so on.
#
# TESTED WITH
#
#   gcc 2.95.3 -gdwarf-2
#   gcc 2.95.3 -gstabs+
#   gcc 3.3.4 -gdwarf-2
#   gcc 3.3.4 -gstabs+
#   gcc 3.4.1 -gdwarf-2
#   gcc 3.4.1 -gstabs+
#   gcc HEAD 20040731 -gdwarf-2
#   gcc HEAD 20040731 -gstabs+
# 
# TODO
#
# Tagless structs.
#
# "A*" versus "A *" and "A&" versus "A &" in user methods.
#
# Test with hp ACC.
#
# -- chastain 2004-08-07

proc cp_test_ptype_class { in_command in_testname in_key in_tag in_class_table { in_tail "" } { in_errata_table { } } } {
    global gdb_prompt
    set wsopt "\[\r\n\t \]*"

    # The test name defaults to the command.

    if { "$in_testname" == "" } then { set in_testname "$in_command" }

    # Save class tables in a history array for reuse.

    global cp_class_table_history
    if { $in_class_table == "ibid" } then {
	if { ! [info exists cp_class_table_history("$in_key,$in_tag") ] } then {
	    fail "$in_testname // bad ibid"
	    return
	}
	set in_class_table $cp_class_table_history("$in_key,$in_tag")
    } else {
	set cp_class_table_history("$in_key,$in_tag") $in_class_table
    }

    # Split the class table into separate tables.

    set list_bases   { }
    set list_vbases  { }
    set list_fields  { }
    set list_methods { }

    foreach class_line $in_class_table {
	switch [lindex $class_line 0] {
	    "base"   { lappend list_bases   [lindex $class_line 1] }
	    "vbase"  { lappend list_vbases  [lindex $class_line 1] }
	    "field"  { lappend list_fields  [lrange $class_line 1 2] }
	    "method" { lappend list_methods [lrange $class_line 1 2] }
	    default  { fail "$in_testname // bad line in class table: $class_line"; return; }
	}
    }

    # Construct a list of synthetic operators.
    # These are: { count ccess-type regular-expression }.

    set list_synth { }
    lappend list_synth [list 0 "public" "$in_tag & operator=\\($in_tag const ?&\\);"]
    lappend list_synth [list 0 "public" "$in_tag\\((int,|) ?$in_tag const ?&\\);"]
    lappend list_synth [list 0 "public" "$in_tag\\((int|void|)\\);"]

    # Actually do the ptype.

    set parse_okay 0
    gdb_test_multiple "$in_command" "$in_testname // parse failed" {
	-re "type = (struct|class)${wsopt}(\[A-Za-z0-9_\]*)${wsopt}((:\[^\{\]*)?)${wsopt}\{(.*)\}${wsopt}(\[^\r\n\]*)\[\r\n\]+$gdb_prompt $" {
	    set parse_okay          1
	    set actual_key          $expect_out(1,string)
	    set actual_tag          $expect_out(2,string)
	    set actual_base_string  $expect_out(3,string)
	    set actual_body         $expect_out(5,string)
	    set actual_tail         $expect_out(6,string)
	}
    }
    if { ! $parse_okay } then { return }

    # Check the actual key.  It would be nice to require that it match
    # the input key, but gdb does not support that.  For now, accept any
    # $actual_key as long as the access property of each field/method
    # matches.

    switch "$actual_key" {
	"class"  { set access "private" }
	"struct" { set access "public"  }
	default  {
	    cp_check_errata "class"  "$actual_key" $in_errata_table
	    cp_check_errata "struct" "$actual_key" $in_errata_table
	    fail "$in_testname // wrong key: $actual_key"
	    return
	}
    }

    # Check the actual tag.

    if { "$actual_tag" != "$in_tag" } then {
	cp_check_errata "$in_tag" "$actual_tag" $in_errata_table
	fail "$in_testname // wrong tag: $actual_tag"
	return
    }

    # Check the actual bases.
    # First parse them into a list.

    set list_actual_bases { }
    if { "$actual_base_string" != "" } then {
	regsub "^:${wsopt}" $actual_base_string "" actual_base_string
	set list_actual_bases [split $actual_base_string ","]
    }

    # Check the base count.

    if { [llength $list_actual_bases] < [llength $list_bases] } then {
	fail "$in_testname // too few bases"
	return
    }
    if { [llength $list_actual_bases] > [llength $list_bases] } then {
	fail "$in_testname // too many bases"
	return
    }

    # Check each base.

    foreach actual_base $list_actual_bases {
	set actual_base [string trim $actual_base]
	set base [lindex $list_bases 0]
	if { "$actual_base" != "$base" } then {
	    cp_check_errata "$base" "$actual_base" $in_errata_table
	    fail "$in_testname // wrong base: $actual_base"
	    return
	}
	set list_bases [lreplace $list_bases 0 0]
    }

    # Parse each line in the body.

    set last_was_access 0
    set vbase_match 0

    foreach actual_line [split $actual_body "\r\n"] {

	# Chomp the line.

	set actual_line [string trim $actual_line]
	if { "$actual_line" == "" } then { continue }

	# Access specifiers.

	if { [regexp "^(public|protected|private)${wsopt}:\$" "$actual_line" s0 s1] } then {
	    set access "$s1"
	    if { $last_was_access } then {
		fail "$in_testname // redundant access specifier"
		return
	    }
	    set last_was_access 1
	    continue
	} else {
	    set last_was_access 0
	}

	# Optional virtual base pointer.

	if { [ llength $list_vbases ] > 0 } then {
	    set vbase [lindex $list_vbases 0]
	    if { [ regexp "$vbase \\*(_vb.|_vb\\\$|__vb_)\[0-9\]*$vbase;" $actual_line ] } then {
		if { "$access" != "private" } then {
		    cp_check_errata "private" "$access" $in_errata_table
		    fail "$in_testname // wrong access specifier for virtual base: $access"
		    return
		}
		set list_vbases [lreplace $list_vbases 0 0]
		set vbase_match 1
		continue
	    }
	}

	# Data field.

	if { [llength $list_fields] > 0 } then {
	    set field_access [lindex [lindex $list_fields 0] 0]
	    set field_decl   [lindex [lindex $list_fields 0] 1]
	    if { "$actual_line" == "$field_decl" } then {
		if { "$access" != "$field_access" } then {
		    cp_check_errata "$field_access" "$access" $in_errata_table
		    fail "$in_testname // wrong access specifier for field: $access"
		    return
		}
		set list_fields [lreplace $list_fields 0 0]
		continue
	    }

	    # Data fields must appear before synths and methods.
	    cp_check_errata "$field_decl" "$actual_line" $in_errata_table
	    fail "$in_testname // unrecognized line type 1: $actual_line"
	    return
	}

	# Method function.

	if { [llength $list_methods] > 0 } then {
	    set method_access [lindex [lindex $list_methods 0] 0]
	    set method_decl   [lindex [lindex $list_methods 0] 1]
	    if { "$actual_line" == "$method_decl" } then {
		if { "$access" != "$method_access" } then {
		    cp_check_errata "$method_access" "$access" $in_errata_table
		    fail "$in_testname // wrong access specifier for method: $access"
		    return
		}
		set list_methods [lreplace $list_methods 0 0]
		continue
	    }

	    # gcc 2.95.3 shows "foo()" as "foo(void)".
	    regsub -all "\\(\\)" $method_decl "(void)" method_decl
	    if { "$actual_line" == "$method_decl" } then {
		if { "$access" != "$method_access" } then {
		    cp_check_errata "$method_access" "$access" $in_errata_table
		    fail "$in_testname // wrong access specifier for method: $access"
		    return
		}
		set list_methods [lreplace $list_methods 0 0]
		continue
	    }
	}

	# Synthetic operators.  These are optional and can be mixed in
	# with the methods in any order, but duplicates are wrong.
	#
	# This test must come after the user methods, so that a user
	# method which matches a synth-method pattern is treated
	# properly as a user method.

	set synth_match 0
	for { set isynth 0 } { $isynth < [llength $list_synth] } { incr isynth } {
	    set synth         [lindex $list_synth $isynth]
	    set synth_count   [lindex $synth 0]
	    set synth_access  [lindex $synth 1]
	    set synth_re      [lindex $synth 2]

	    if { [ regexp "$synth_re" "$actual_line" ] } then {

		if { "$access" != "$synth_access" } then {
		    cp_check_errata "$synth_access" "$access" $in_errata_table
		    fail "$in_testname // wrong access specifier for synthetic operator: $access"
		    return
		}

		if { $synth_count > 0 } then {
		    cp_check_errata "$actual_line" "$actual_line" $in_errata_table
		    fail "$in_testname // duplicate synthetic operator: $actual_line"
		}

		# Update the count in list_synth.

		incr synth_count 
		set synth [list $synth_count $synth_access "$synth_re"]
		set list_synth [lreplace $list_synth $isynth $isynth $synth]

		# Match found.

		set synth_match 1
		break
	    }
	}
	if { $synth_match } then { continue }

	# Unrecognized line.

	if { [llength $list_methods] > 0 } then {
	    set method_decl [lindex [lindex $list_methods 0] 1]
	    cp_check_errata "$method_decl" "$actual_line" $in_errata_table
	}

	fail "$in_testname // unrecognized line type 2: $actual_line"
	return
    }

    # Check for missing elements.

    if { $vbase_match } then {
	if { [llength $list_vbases] > 0 } then {
	    fail "$in_testname // missing virtual base pointers"
	    return
	}
    }

    if { [llength $list_fields] > 0 } then {
	fail "$in_testname // missing fields"
	return
    }

    if { [llength $list_methods] > 0 } then {
	fail "$in_testname // missing methods"
	return
    }

    # Check the tail.

    set actual_tail [string trim $actual_tail]
    if { "$actual_tail" != "$in_tail" } then {
	cp_check_errata "$in_tail" "$actual_tail" $in_errata_table
	fail "$in_testname // wrong tail: $actual_tail"
	return
    }

    # It all worked!

    pass "$in_testname"
    return
}
