forked from Imagelibrary/binutils-gdb
PR c++/13356
* gdbtypes.c (strict_type_checking): New variable. (show_strict_type_checking): New function. (rank_one_type): Return NS_POINTER_INTEGER_CONVERSION_BADNESS if strict type checking is disabled. (_initialize_gdbtypes): Add "check type" subcommand. * gdbtypes.h (NS_INTEGER_POINTER_CONVERSION_BADNESS): New struct. PR c++/13356 * gdb.base/default.exp: Update all "check type" tests. * gdb.base/help.exp: Likewise. * gdb.base/setshow.exp: Likewise. * gdb.cp/converts.cc (foo1_type_check): New function. (foo2_type_check): New function. (foo3_type_check): New function. (main): Call new functions. * converts.exp: Add tests for integer-to-pointer conversions with/without strict type-checking. PR c++/13356 * gdb.texinfo (Type and Range Checking): Remove warning. Remove spurious commas. Update text and examples for re-implementation of set/show check type. (C and C++ Type and Range Checks): Likewise. * language.h (type_mode): Remove. (type_check): Remove. (struct language_defn): Remove la_type_check. (STRICT_TYPE): Remove unused macro. (type_error): Remove. * language.c (set_type_range_case): Renamed to ... (set_range_case): ... this. Update all callers. Remove type_mode/type_check. (type_mode): Remove. (type_check): Remove. (show_type_command): Remove. (set_type_command): Remove. (language_info): Remove type checking output. (type_error): Remove unused function. (range_error): Update comment. (unknown_language_defn): Remove la_type_check. (auto_language_defn): Likewise. (local_language_defn): Likewise. (_initialize_language): Remove "check type" subcommand. * ada-lang.c (ada_language_defn): Remove la_type_check. * c-lang.c (c_language_defn): Likewise. (cplus_language_defn): Likewise. (asm_language_defn): Likewise. (minimal_language_defn): Likewise. * d-lang.c (d_language_defn): Likewise. * f-lang.c (f_language_defn): Likewise. * go-lang.c (go_language_defn): Likewise. * jv-lang.c (java_language_defn): Likewise. * m2-lang.c (m2_language_defn): Likewise. * objc-lang.c (objc_language_defn): Likewise. * opencl-lang.c (opencl_language_defn): Likewise. * p-lang.c (pascal_language_defn): Likewise.
This commit is contained in:
@@ -59,6 +59,7 @@ 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};
|
||||
const struct rank NS_POINTER_CONVERSION_BADNESS = {10,0};
|
||||
const struct rank NS_INTEGER_POINTER_CONVERSION_BADNESS = {3,0};
|
||||
|
||||
/* Floatformat pairs. */
|
||||
const struct floatformat *floatformats_ieee_half[BFD_ENDIAN_UNKNOWN] = {
|
||||
@@ -119,6 +120,10 @@ static int opaque_type_resolution = 1;
|
||||
|
||||
unsigned int overload_debug = 0;
|
||||
|
||||
/* A flag to enable strict type checking. */
|
||||
|
||||
static int strict_type_checking = 1;
|
||||
|
||||
/* A function to show whether opaque types are resolved. */
|
||||
|
||||
static void
|
||||
@@ -141,6 +146,15 @@ show_overload_debug (struct ui_file *file, int from_tty,
|
||||
value);
|
||||
}
|
||||
|
||||
/* A function to show the status of strict type checking. */
|
||||
|
||||
static void
|
||||
show_strict_type_checking (struct ui_file *file, int from_tty,
|
||||
struct cmd_list_element *c, const char *value)
|
||||
{
|
||||
fprintf_filtered (file, _("Strict type checking is %s.\n"), value);
|
||||
}
|
||||
|
||||
|
||||
/* Allocate a new OBJFILE-associated type structure and fill it
|
||||
with some defaults. Space for the type structure is allocated
|
||||
@@ -2507,12 +2521,20 @@ rank_one_type (struct type *parm, struct type *arg, struct value *value)
|
||||
case TYPE_CODE_FUNC:
|
||||
return rank_one_type (TYPE_TARGET_TYPE (parm), arg, NULL);
|
||||
case TYPE_CODE_INT:
|
||||
if (value != NULL && TYPE_CODE (value_type (value)) == TYPE_CODE_INT
|
||||
&& value_as_long (value) == 0)
|
||||
if (value != NULL && TYPE_CODE (value_type (value)) == TYPE_CODE_INT)
|
||||
{
|
||||
/* Null pointer conversion: allow it to be cast to a pointer.
|
||||
[4.10.1 of C++ standard draft n3290] */
|
||||
return NULL_POINTER_CONVERSION_BADNESS;
|
||||
if (value_as_long (value) == 0)
|
||||
{
|
||||
/* Null pointer conversion: allow it to be cast to a pointer.
|
||||
[4.10.1 of C++ standard draft n3290] */
|
||||
return NULL_POINTER_CONVERSION_BADNESS;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* If type checking is disabled, allow the conversion. */
|
||||
if (!strict_type_checking)
|
||||
return NS_INTEGER_POINTER_CONVERSION_BADNESS;
|
||||
}
|
||||
}
|
||||
/* fall through */
|
||||
case TYPE_CODE_ENUM:
|
||||
@@ -4068,4 +4090,13 @@ _initialize_gdbtypes (void)
|
||||
NULL, NULL,
|
||||
show_opaque_type_resolution,
|
||||
&setlist, &showlist);
|
||||
|
||||
/* Add an option to permit non-strict type checking. */
|
||||
add_setshow_boolean_cmd ("type", class_support,
|
||||
&strict_type_checking,
|
||||
_("Set strict type checking."),
|
||||
_("Show strict type checking."),
|
||||
NULL, NULL,
|
||||
show_strict_type_checking,
|
||||
&setchecklist, &showchecklist);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user