PR gdb/13483
authorKeith Seitz <keiths@redhat.com>
Mon, 10 Sep 2012 17:12:53 +0000 (17:12 +0000)
committerKeith Seitz <keiths@redhat.com>
Mon, 10 Sep 2012 17:12:53 +0000 (17:12 +0000)
* gdbtypes.h (BOOL_PTR_CONVERSION_BADNESS): Rename to ...
(BOOL_CONVERSION_BADNESS): ... this.
* gdbtypes.c (BOOL_PTR_CONVERSION_BADNESS): Likewise.
(rank_one_type): Allow all boolean conversions
permitted by the standard.

* gdb.cp/converts.cc (A::A): Add ctor.
(A::member_): Add member.
(enum my_enum): New enumeration.
(main): Add calls to foo1_7 with various
permitted arguments.
* gdb.cp/converts.exp: Add tests for boolean
conversions permitted by the standard.

gdb/ChangeLog
gdb/gdbtypes.c
gdb/gdbtypes.h
gdb/testsuite/ChangeLog
gdb/testsuite/gdb.cp/converts.cc
gdb/testsuite/gdb.cp/converts.exp

index ffc5c9443178ab6bcbe35d67e68bfa22c86db507..c00a32d6e5c8b3b1d78c29063d9cd4f9e12453ad 100644 (file)
@@ -1,3 +1,12 @@
+2012-09-10  Keith Seitz  <keiths@redhat.com>
+
+       PR gdb/13483
+       * gdbtypes.h (BOOL_PTR_CONVERSION_BADNESS): Rename to ...
+       (BOOL_CONVERSION_BADNESS): ... this.
+       * gdbtypes.c (BOOL_PTR_CONVERSION_BADNESS): Likewise.
+       (rank_one_type): Allow all boolean conversions
+       permitted by the standard.
+
 2012-09-06  Tom Tromey  <tromey@redhat.com>
 
        * python/py-newobjfileevent.c (create_new_objfile_event_object):
index 21d9043a1389df4247bf34e7ef2ef09a19ff3241..8ac879970656349f42a5bdbf033ea3ec900bea47 100644 (file)
@@ -54,7 +54,7 @@ const struct rank INTEGER_CONVERSION_BADNESS = {2,0};
 const struct rank FLOAT_CONVERSION_BADNESS = {2,0};
 const struct rank INT_FLOAT_CONVERSION_BADNESS = {2,0};
 const struct rank VOID_PTR_CONVERSION_BADNESS = {2,0};
-const struct rank BOOL_PTR_CONVERSION_BADNESS = {3,0};
+const struct rank BOOL_CONVERSION_BADNESS = {3,0};
 const struct rank BASE_CONVERSION_BADNESS = {2,0};
 const struct rank REFERENCE_CONVERSION_BADNESS = {2,0};
 const struct rank NULL_POINTER_CONVERSION_BADNESS = {2,0};
@@ -2718,14 +2718,23 @@ rank_one_type (struct type *parm, struct type *arg, struct value *value)
     case TYPE_CODE_BOOL:
       switch (TYPE_CODE (arg))
        {
+         /* n3290 draft, section 4.12.1 (conv.bool):
+
+            "A prvalue of arithmetic, unscoped enumeration, pointer, or
+            pointer to member type can be converted to a prvalue of type
+            bool.  A zero value, null pointer value, or null member pointer
+            value is converted to false; any other value is converted to
+            true.  A prvalue of type std::nullptr_t can be converted to a
+            prvalue of type bool; the resulting value is false."  */
        case TYPE_CODE_INT:
        case TYPE_CODE_CHAR:
-       case TYPE_CODE_RANGE:
        case TYPE_CODE_ENUM:
        case TYPE_CODE_FLT:
-         return INCOMPATIBLE_TYPE_BADNESS;
+       case TYPE_CODE_MEMBERPTR:
        case TYPE_CODE_PTR:
-         return BOOL_PTR_CONVERSION_BADNESS;
+         return BOOL_CONVERSION_BADNESS;
+       case TYPE_CODE_RANGE:
+         return INCOMPATIBLE_TYPE_BADNESS;
        case TYPE_CODE_BOOL:
          return EXACT_MATCH_BADNESS;
        default:
index 991026b92acb56f413897cec3452d32d547ab4ed..73fcbb196520edaa27af37b22ce2ae692bec4ac8 100644 (file)
@@ -1603,8 +1603,8 @@ extern const struct rank FLOAT_CONVERSION_BADNESS;
 extern const struct rank INT_FLOAT_CONVERSION_BADNESS;
 /* Badness of conversion of pointer to void pointer.  */
 extern const struct rank VOID_PTR_CONVERSION_BADNESS;
-/* Badness of conversion of pointer to boolean.  */
-extern const struct rank BOOL_PTR_CONVERSION_BADNESS;
+/* Badness of conversion to boolean.  */
+extern const struct rank BOOL_CONVERSION_BADNESS;
 /* Badness of converting derived to base class.  */
 extern const struct rank BASE_CONVERSION_BADNESS;
 /* Badness of converting from non-reference to reference.  */
index 842fc154ec2a4c7b8bd6d97e8abab58000aefeab..cdf4ad1d2419d2a54ac57359d5f0afe3f4add249 100644 (file)
@@ -1,3 +1,14 @@
+2012-09-10  Keith Seitz  <keiths@redhat.com>
+
+       PR gdb/13483
+       * gdb.cp/converts.cc (A::A): Add ctor.
+       (A::member_): Add member.
+       (enum my_enum): New enumeration.
+       (main): Add calls to foo1_7 with various
+       permitted arguments.
+       * gdb.cp/converts.exp: Add tests for boolean
+       conversions permitted by the standard.
+
 2012-09-08  Khoo Yit Phang  <khooyp@cs.umd.edu>
 
        Replace -nw option with $INTERNAL_GDBFLAGS in "xgdb" tests to
index ecebbf80a67ceaa835fc3a0ff831eabf823c9dbc..1cda43d0578cd1fe25955faf82139c9ff538c2c5 100644 (file)
@@ -1,10 +1,17 @@
-class A {};
+class A
+{
+public:
+  A() : member_ (0) {};
+  int member_;
+};
 class B : public A {};
 
 typedef A TA1;
 typedef A TA2;
 typedef TA2 TA3;
 
+enum my_enum {MY_A, MY_B, MY_C, MY_D};
+
 int foo0_1 (TA1)  { return 1; }
 int foo0_2 (TA3)  { return 2; }
 int foo0_3 (A***) { return 3; }
@@ -62,6 +69,21 @@ int main()
   foo2_3 (b);        // ..array of pointers
   foo2_4 ((int**)b); // ..array of wrong pointers
 
+  // X to boolean conversions allowed by the standard
+  int integer = 0;
+  long long_int = 1;
+  float fp = 1.0;
+  double dp = 1.0;
+  foo1_7 (integer);            // integer to boolean
+  foo1_7 (long_int);           // long to boolean
+  foo1_7 (*a);                 // char to boolean
+  foo1_7 (MY_A);               // unscoped enum to boolean
+  foo1_7 (&foo1_7);            // pointer to boolean
+  foo1_7 (&A::member_);                // pointer to member to boolean
+  foo1_7 (a);                  // pointer to boolean
+  foo1_7 (fp);                 // float to boolean
+  foo1_7 (dp);                 // double  to boolean
+
   foo3_1 (0, 0);
   foo3_2 (0, static_cast<char const**> (0));
   foo3_2 (0, 0);
index 414e2d05aa6570e093a5ceeae7678f72f05a7dc1..148ac0f0b428360b90ee6fc79c01a1cf3d033b5d 100644 (file)
@@ -77,6 +77,21 @@ gdb_test "p foo3_1 (0, (const char**) 1)" " = 31"
 gdb_test "p foo3_2 (0, 0)" "= 32"
 gdb_test "p foo3_2 (0, (char const**) 0)" " = 320"
 
+# Tests for boolean conversions allowed by the standard
+gdb_test "p foo1_7(0)" " = 17"
+gdb_test "p foo1_7(integer)" " = 17"
+gdb_test "p foo1_7(long_int)" " = 17"
+gdb_test "p foo1_7(*a)" " = 17"
+gdb_test "p foo1_7(MY_A)" " = 17"
+gdb_test "p foo1_7(&foo1_7)" " = 17"
+gdb_test "p foo1_7(&A::member_)" " = 17"
+gdb_test "p foo1_7(a)" " = 17"
+gdb_test "p foo1_7(fp)" " = 17"
+gdb_test "p foo1_7(dp)" " = 17"
+gdb_test "p foo1_7(-1.23)" " = 17"
+gdb_test "p foo1_7(ta)" \
+    "Cannot resolve function foo1_7 to any overloaded instance"
+
 # Test for strict type checking
 set error_str "Cannot resolve function %s to any overloaded instance"
 gdb_test "show check type" "Strict type checking is on\."