From 5b4f6e25c3d9e1d51c35ca0d5000ea0b32b26a81 Mon Sep 17 00:00:00 2001 From: Keith Seitz Date: Mon, 10 Sep 2012 17:12:53 +0000 Subject: [PATCH] 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. * 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 | 9 +++++++++ gdb/gdbtypes.c | 17 +++++++++++++---- gdb/gdbtypes.h | 4 ++-- gdb/testsuite/ChangeLog | 11 +++++++++++ gdb/testsuite/gdb.cp/converts.cc | 24 +++++++++++++++++++++++- gdb/testsuite/gdb.cp/converts.exp | 15 +++++++++++++++ 6 files changed, 73 insertions(+), 7 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index ffc5c944317..c00a32d6e5c 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,12 @@ +2012-09-10 Keith Seitz + + 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 * python/py-newobjfileevent.c (create_new_objfile_event_object): diff --git a/gdb/gdbtypes.c b/gdb/gdbtypes.c index 21d9043a138..8ac87997065 100644 --- a/gdb/gdbtypes.c +++ b/gdb/gdbtypes.c @@ -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: diff --git a/gdb/gdbtypes.h b/gdb/gdbtypes.h index 991026b92ac..73fcbb19652 100644 --- a/gdb/gdbtypes.h +++ b/gdb/gdbtypes.h @@ -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. */ diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index 842fc154ec2..cdf4ad1d241 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,14 @@ +2012-09-10 Keith Seitz + + 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 Replace -nw option with $INTERNAL_GDBFLAGS in "xgdb" tests to diff --git a/gdb/testsuite/gdb.cp/converts.cc b/gdb/testsuite/gdb.cp/converts.cc index ecebbf80a67..1cda43d0578 100644 --- a/gdb/testsuite/gdb.cp/converts.cc +++ b/gdb/testsuite/gdb.cp/converts.cc @@ -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 (0)); foo3_2 (0, 0); diff --git a/gdb/testsuite/gdb.cp/converts.exp b/gdb/testsuite/gdb.cp/converts.exp index 414e2d05aa6..148ac0f0b42 100644 --- a/gdb/testsuite/gdb.cp/converts.exp +++ b/gdb/testsuite/gdb.cp/converts.exp @@ -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\." -- 2.30.2