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

# Copyright 2003, 2004, 2007, 2008, 2009, 2010, 2011
# 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
}
