{
};
+struct VirtualLeft
+{
+ virtual ~VirtualLeft () {}
+
+ int left;
+};
+
+struct VirtualRight
+{
+ virtual ~VirtualRight () {}
+
+ int right;
+};
+
+struct VirtualLeftRight : public VirtualLeft, public VirtualRight
+{
+};
+
int
main (int argc, char **argv)
{
unsigned long long gd_value = (unsigned long long) (std::uintptr_t)&gd;
unsigned long long r_value = (unsigned long long) (Right *) &gd;
+ VirtualLeftRight *vlr = new VirtualLeftRight ();
+ VirtualLeft *vl = vlr;
+ VirtualRight *vr = vlr;
+
return 0; /* breakpoint spot: casts.exp: 1 */
}
gdb_test "print (unsigned long long) (LeftRight *) (Right *) r_value == gd_value" \
" = true"
+gdb_test "print dynamic_cast<VirtualLeftRight *> (vlr) == vlr" " = true"
+gdb_test "print dynamic_cast<VirtualLeftRight *> (vl) == vlr" " = true"
+gdb_test "print dynamic_cast<VirtualLeftRight *> (vr) == vlr" " = true"
+gdb_test "print dynamic_cast<VirtualLeft *> (vlr) == vl" " = true"
+gdb_test "print dynamic_cast<VirtualLeft *> (vl) == vl" " = true"
+gdb_test "print dynamic_cast<VirtualLeft *> (vr) == vl" " = true"
+gdb_test "print dynamic_cast<VirtualRight *> (vlr) == vr" " = true"
+gdb_test "print dynamic_cast<VirtualRight *> (vl) == vr" " = true"
+gdb_test "print dynamic_cast<VirtualRight *> (vr) == vr" " = true"
+
+gdb_test "print &dynamic_cast<VirtualLeftRight &> (*vlr) == vlr" " = true"
+gdb_test "print &dynamic_cast<VirtualLeftRight &> (*vl) == vlr" " = true"
+gdb_test "print &dynamic_cast<VirtualLeftRight &> (*vr) == vlr" " = true"
+gdb_test "print &dynamic_cast<VirtualLeft &> (*vlr) == vl" " = true"
+gdb_test "print &dynamic_cast<VirtualLeft &> (*vl) == vl" " = true"
+gdb_test "print &dynamic_cast<VirtualLeft &> (*vr) == vl" " = true"
+gdb_test "print &dynamic_cast<VirtualRight &> (*vlr) == vr" " = true"
+gdb_test "print &dynamic_cast<VirtualRight &> (*vl) == vr" " = true"
+gdb_test "print &dynamic_cast<VirtualRight &> (*vr) == vr" " = true"
+
if {[prepare_for_testing "failed to prepare" ${testfile}03 $srcfile2 \
{debug c++ additional_flags=-std=c++03}]} {
return -1
/* If the classes are the same, just return the argument. */
if (class_types_same_p (class_type, arg_type))
- return value_cast (type, arg);
+ return value_cast (type, original_arg);
/* If the target type is a unique base class of the argument's
declared type, just cast it. */
&& resolved_type->target_type ()->code () == TYPE_CODE_VOID)
return value_at_lazy (type, addr);
- tem = value_at (type, addr);
- type = tem->type ();
+ tem = value_at (resolved_type->target_type (), addr);
+ type = (is_ref
+ ? lookup_reference_type (tem->type (), resolved_type->code ())
+ : lookup_pointer_type (tem->type ()));
/* The first dynamic check specified in 5.2.7. */
if (is_public_ancestor (arg_type, resolved_type->target_type ()))
{
if (class_types_same_p (rtti_type, resolved_type->target_type ()))
- return tem;
+ return (is_ref
+ ? value_ref (tem, resolved_type->code ())
+ : value_addr (tem));
result = NULL;
if (dynamic_cast_check_1 (resolved_type->target_type (),
tem->contents_for_printing ().data (),