mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2024-11-27 03:54:41 +08:00
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:
parent
7b458c12dc
commit
a451cb65e3
@ -1,3 +1,48 @@
|
||||
2012-08-17 Keith Seitz <keiths@redhat.com>
|
||||
|
||||
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.
|
||||
|
||||
2012-08-17 Keith Seitz <keiths@redhat.com>
|
||||
|
||||
* 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.
|
||||
|
||||
2012-08-16 Mike Frysinger <vapier@gentoo.org>
|
||||
|
||||
* infcmd.c (_initialize_infcmd): Remove trailing ) in next help text.
|
||||
|
@ -12499,7 +12499,6 @@ const struct language_defn ada_language_defn = {
|
||||
"ada", /* Language name */
|
||||
language_ada,
|
||||
range_check_off,
|
||||
type_check_off,
|
||||
case_sensitive_on, /* Yes, Ada is case-insensitive, but
|
||||
that's not quite what this means. */
|
||||
array_row_major,
|
||||
|
@ -831,7 +831,6 @@ const struct language_defn c_language_defn =
|
||||
"c", /* Language name */
|
||||
language_c,
|
||||
range_check_off,
|
||||
type_check_off,
|
||||
case_sensitive_on,
|
||||
array_row_major,
|
||||
macro_expansion_c,
|
||||
@ -955,7 +954,6 @@ const struct language_defn cplus_language_defn =
|
||||
"c++", /* Language name */
|
||||
language_cplus,
|
||||
range_check_off,
|
||||
type_check_off,
|
||||
case_sensitive_on,
|
||||
array_row_major,
|
||||
macro_expansion_c,
|
||||
@ -997,7 +995,6 @@ const struct language_defn asm_language_defn =
|
||||
"asm", /* Language name */
|
||||
language_asm,
|
||||
range_check_off,
|
||||
type_check_off,
|
||||
case_sensitive_on,
|
||||
array_row_major,
|
||||
macro_expansion_c,
|
||||
@ -1044,7 +1041,6 @@ const struct language_defn minimal_language_defn =
|
||||
"minimal", /* Language name */
|
||||
language_minimal,
|
||||
range_check_off,
|
||||
type_check_off,
|
||||
case_sensitive_on,
|
||||
array_row_major,
|
||||
macro_expansion_c,
|
||||
|
@ -240,7 +240,6 @@ static const struct language_defn d_language_defn =
|
||||
"d",
|
||||
language_d,
|
||||
range_check_off,
|
||||
type_check_off,
|
||||
case_sensitive_on,
|
||||
array_row_major,
|
||||
macro_expansion_c,
|
||||
|
@ -1,3 +1,12 @@
|
||||
2012-08-17 Keith Seitz <keiths@redhat.com>
|
||||
|
||||
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.
|
||||
|
||||
2012-08-16 Yao Qi <yao@codesourcery.com>
|
||||
|
||||
* gdb.texinfo (Types In Python): Mention gdb.TYPE_CODE_BITSTRING
|
||||
|
@ -12670,29 +12670,18 @@ List all the filename extensions and the associated languages.
|
||||
@node Checks
|
||||
@section Type and Range Checking
|
||||
|
||||
@quotation
|
||||
@emph{Warning:} In this release, the @value{GDBN} commands for type and range
|
||||
checking are included, but they do not yet have any effect. This
|
||||
section documents the intended facilities.
|
||||
@end quotation
|
||||
@c FIXME remove warning when type/range code added
|
||||
|
||||
Some languages are designed to guard you against making seemingly common
|
||||
errors through a series of compile- and run-time checks. These include
|
||||
checking the type of arguments to functions and operators, and making
|
||||
checking the type of arguments to functions and operators and making
|
||||
sure mathematical overflows are caught at run time. Checks such as
|
||||
these help to ensure a program's correctness once it has been compiled
|
||||
by eliminating type mismatches, and providing active checks for range
|
||||
by eliminating type mismatches and providing active checks for range
|
||||
errors when your program is running.
|
||||
|
||||
@value{GDBN} can check for conditions like the above if you wish.
|
||||
Although @value{GDBN} does not check the statements in your program,
|
||||
it can check expressions entered directly into @value{GDBN} for
|
||||
evaluation via the @code{print} command, for example. As with the
|
||||
working language, @value{GDBN} can also decide whether or not to check
|
||||
automatically based on your program's source language.
|
||||
@xref{Supported Languages, ,Supported Languages}, for the default
|
||||
settings of supported languages.
|
||||
By default @value{GDBN} checks for these errors according to the
|
||||
rules of the current source language. Although @value{GDBN} does not check
|
||||
the statements in your program, it can check expressions entered directly
|
||||
into @value{GDBN} for evaluation via the @code{print} command, for example.
|
||||
|
||||
@menu
|
||||
* Type Checking:: An overview of type checking
|
||||
@ -12704,69 +12693,51 @@ settings of supported languages.
|
||||
@node Type Checking
|
||||
@subsection An Overview of Type Checking
|
||||
|
||||
Some languages, such as Modula-2, are strongly typed, meaning that the
|
||||
Some languages, such as C and C@t{++}, are strongly typed, meaning that the
|
||||
arguments to operators and functions have to be of the correct type,
|
||||
otherwise an error occurs. These checks prevent type mismatch
|
||||
errors from ever causing any run-time problems. For example,
|
||||
|
||||
@smallexample
|
||||
1 + 2 @result{} 3
|
||||
int klass::my_method(char *b) @{ return b ? 1 : 2; @}
|
||||
|
||||
(@value{GDBP}) print obj.my_method (0)
|
||||
$1 = 2
|
||||
@exdent but
|
||||
@error{} 1 + 2.3
|
||||
(@value{GDBP}) print obj.my_method (0x1234)
|
||||
Cannot resolve method klass::my_method to any overloaded instance
|
||||
@end smallexample
|
||||
|
||||
The second example fails because the @code{CARDINAL} 1 is not
|
||||
type-compatible with the @code{REAL} 2.3.
|
||||
The second example fails because in C@t{++} the integer constant
|
||||
@samp{0x1234} is not type-compatible with the pointer parameter type.
|
||||
|
||||
For the expressions you use in @value{GDBN} commands, you can tell the
|
||||
@value{GDBN} type checker to skip checking;
|
||||
For the expressions you use in @value{GDBN} commands, you can tell
|
||||
@value{GDBN} to not enforce strict type checking or
|
||||
to treat any mismatches as errors and abandon the expression;
|
||||
or to only issue warnings when type mismatches occur,
|
||||
but evaluate the expression anyway. When you choose the last of
|
||||
these, @value{GDBN} evaluates expressions like the second example above, but
|
||||
also issues a warning.
|
||||
When type checking is disabled, @value{GDBN} successfully evaluates
|
||||
expressions like the second example above.
|
||||
|
||||
Even if you turn type checking off, there may be other reasons
|
||||
Even if type checking is off, there may be other reasons
|
||||
related to type that prevent @value{GDBN} from evaluating an expression.
|
||||
For instance, @value{GDBN} does not know how to add an @code{int} and
|
||||
a @code{struct foo}. These particular type errors have nothing to do
|
||||
with the language in use, and usually arise from expressions, such as
|
||||
the one described above, which make little sense to evaluate anyway.
|
||||
with the language in use and usually arise from expressions which make
|
||||
little sense to evaluate anyway.
|
||||
|
||||
Each language defines to what degree it is strict about type. For
|
||||
instance, both Modula-2 and C require the arguments to arithmetical
|
||||
operators to be numbers. In C, enumerated types and pointers can be
|
||||
represented as numbers, so that they are valid arguments to mathematical
|
||||
operators. @xref{Supported Languages, ,Supported Languages}, for further
|
||||
details on specific languages.
|
||||
|
||||
@value{GDBN} provides some additional commands for controlling the type checker:
|
||||
@value{GDBN} provides some additional commands for controlling type checking:
|
||||
|
||||
@kindex set check type
|
||||
@kindex show check type
|
||||
@table @code
|
||||
@item set check type auto
|
||||
Set type checking on or off based on the current working language.
|
||||
@xref{Supported Languages, ,Supported Languages}, for the default settings for
|
||||
each language.
|
||||
|
||||
@item set check type on
|
||||
@itemx set check type off
|
||||
Set type checking on or off, overriding the default setting for the
|
||||
current working language. Issue a warning if the setting does not
|
||||
match the language default. If any type mismatches occur in
|
||||
Set strict type checking on or off. If any type mismatches occur in
|
||||
evaluating an expression while type checking is on, @value{GDBN} prints a
|
||||
message and aborts evaluation of the expression.
|
||||
|
||||
@item set check type warn
|
||||
Cause the type checker to issue warnings, but to always attempt to
|
||||
evaluate the expression. Evaluating the expression may still
|
||||
be impossible for other reasons. For example, @value{GDBN} cannot add
|
||||
numbers and structures.
|
||||
|
||||
@item show type
|
||||
Show the current setting of the type checker, and whether or not @value{GDBN}
|
||||
is setting it automatically.
|
||||
@item show check type
|
||||
Show the current setting of type checking and whether @value{GDBN}
|
||||
is enforcing strict type checking rules.
|
||||
@end table
|
||||
|
||||
@cindex range checking
|
||||
@ -13217,8 +13188,8 @@ specification.
|
||||
|
||||
@cindex C and C@t{++} defaults
|
||||
|
||||
If you allow @value{GDBN} to set type and range checking automatically, they
|
||||
both default to @code{off} whenever the working language changes to
|
||||
If you allow @value{GDBN} to set range checking automatically, it
|
||||
defaults to @code{off} whenever the working language changes to
|
||||
C or C@t{++}. This happens regardless of whether you or @value{GDBN}
|
||||
selects the working language.
|
||||
|
||||
@ -13229,37 +13200,15 @@ these files, it sets the working language to C or C@t{++}.
|
||||
@xref{Automatically, ,Having @value{GDBN} Infer the Source Language},
|
||||
for further details.
|
||||
|
||||
@c Type checking is (a) primarily motivated by Modula-2, and (b)
|
||||
@c unimplemented. If (b) changes, it might make sense to let this node
|
||||
@c appear even if Mod-2 does not, but meanwhile ignore it. roland 16jul93.
|
||||
|
||||
@node C Checks
|
||||
@subsubsection C and C@t{++} Type and Range Checks
|
||||
|
||||
@cindex C and C@t{++} checks
|
||||
|
||||
By default, when @value{GDBN} parses C or C@t{++} expressions, type checking
|
||||
is not used. However, if you turn type checking on, @value{GDBN}
|
||||
considers two variables type equivalent if:
|
||||
|
||||
@itemize @bullet
|
||||
@item
|
||||
The two variables are structured and have the same structure, union, or
|
||||
enumerated tag.
|
||||
|
||||
@item
|
||||
The two variables have the same type name, or types that have been
|
||||
declared equivalent through @code{typedef}.
|
||||
|
||||
@ignore
|
||||
@c leaving this out because neither J Gilmore nor R Pesch understand it.
|
||||
@c FIXME--beers?
|
||||
@item
|
||||
The two @code{struct}, @code{union}, or @code{enum} variables are
|
||||
declared in the same declaration. (Note: this may not be true for all C
|
||||
compilers.)
|
||||
@end ignore
|
||||
@end itemize
|
||||
By default, when @value{GDBN} parses C or C@t{++} expressions, strict type
|
||||
checking is used. However, if you turn type checking off, @value{GDBN}
|
||||
will allow certain non-standard conversions, such as promoting integer
|
||||
constants to pointers.
|
||||
|
||||
Range checking, if turned on, is done on mathematical operations. Array
|
||||
indices are not checked, since they are often used to index a pointer
|
||||
|
@ -274,7 +274,6 @@ const struct language_defn f_language_defn =
|
||||
"fortran",
|
||||
language_fortran,
|
||||
range_check_on,
|
||||
type_check_on,
|
||||
case_sensitive_off,
|
||||
array_column_major,
|
||||
macro_expansion_no,
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -1616,6 +1616,9 @@ extern const struct rank NULL_POINTER_CONVERSION;
|
||||
/* Converting a pointer to an int is usually OK. */
|
||||
extern const struct rank NS_POINTER_CONVERSION_BADNESS;
|
||||
|
||||
/* Badness of converting a (non-zero) integer constant
|
||||
to a pointer. */
|
||||
extern const struct rank NS_INTEGER_POINTER_CONVERSION_BADNESS;
|
||||
|
||||
extern struct rank sum_ranks (struct rank a, struct rank b);
|
||||
extern int compare_ranks (struct rank a, struct rank b);
|
||||
|
@ -562,7 +562,6 @@ static const struct language_defn go_language_defn =
|
||||
"go",
|
||||
language_go,
|
||||
range_check_off,
|
||||
type_check_off,
|
||||
case_sensitive_on,
|
||||
array_row_major,
|
||||
macro_expansion_no,
|
||||
|
@ -1167,7 +1167,6 @@ const struct language_defn java_language_defn =
|
||||
"java", /* Language name */
|
||||
language_java,
|
||||
range_check_off,
|
||||
type_check_off,
|
||||
case_sensitive_on,
|
||||
array_row_major,
|
||||
macro_expansion_no,
|
||||
|
137
gdb/language.c
137
gdb/language.c
@ -55,7 +55,7 @@ static void show_check (char *, int);
|
||||
|
||||
static void set_check (char *, int);
|
||||
|
||||
static void set_type_range_case (void);
|
||||
static void set_range_case (void);
|
||||
|
||||
static void unk_lang_emit_char (int c, struct type *type,
|
||||
struct ui_file *stream, int quoter);
|
||||
@ -81,8 +81,6 @@ extern const struct language_defn unknown_language_defn;
|
||||
|
||||
enum range_mode range_mode = range_mode_auto;
|
||||
enum range_check range_check = range_check_off;
|
||||
enum type_mode type_mode = type_mode_auto;
|
||||
enum type_check type_check = type_check_off;
|
||||
enum case_mode case_mode = case_mode_auto;
|
||||
enum case_sensitivity case_sensitivity = case_sensitive_on;
|
||||
|
||||
@ -174,7 +172,7 @@ set_language_command (char *ignore, int from_tty, struct cmd_list_element *c)
|
||||
/* Enter manual mode. Set the specified language. */
|
||||
language_mode = language_mode_manual;
|
||||
current_language = languages[i];
|
||||
set_type_range_case ();
|
||||
set_range_case ();
|
||||
expected_language = current_language;
|
||||
return;
|
||||
}
|
||||
@ -186,79 +184,6 @@ set_language_command (char *ignore, int from_tty, struct cmd_list_element *c)
|
||||
language);
|
||||
}
|
||||
|
||||
/* Show command. Display a warning if the type setting does
|
||||
not match the current language. */
|
||||
static void
|
||||
show_type_command (struct ui_file *file, int from_tty,
|
||||
struct cmd_list_element *c, const char *value)
|
||||
{
|
||||
if (type_mode == type_mode_auto)
|
||||
{
|
||||
char *tmp = NULL;
|
||||
|
||||
switch (type_check)
|
||||
{
|
||||
case type_check_on:
|
||||
tmp = "on";
|
||||
break;
|
||||
case type_check_off:
|
||||
tmp = "off";
|
||||
break;
|
||||
case type_check_warn:
|
||||
tmp = "warn";
|
||||
break;
|
||||
default:
|
||||
internal_error (__FILE__, __LINE__,
|
||||
"Unrecognized type check setting.");
|
||||
}
|
||||
|
||||
fprintf_filtered (gdb_stdout,
|
||||
_("Type checking is \"auto; currently %s\".\n"),
|
||||
tmp);
|
||||
}
|
||||
else
|
||||
fprintf_filtered (gdb_stdout, _("Type checking is \"%s\".\n"),
|
||||
value);
|
||||
|
||||
if (type_check != current_language->la_type_check)
|
||||
warning (_("the current type check setting"
|
||||
" does not match the language.\n"));
|
||||
}
|
||||
|
||||
/* Set command. Change the setting for type checking. */
|
||||
static void
|
||||
set_type_command (char *ignore, int from_tty, struct cmd_list_element *c)
|
||||
{
|
||||
if (strcmp (type, "on") == 0)
|
||||
{
|
||||
type_check = type_check_on;
|
||||
type_mode = type_mode_manual;
|
||||
}
|
||||
else if (strcmp (type, "warn") == 0)
|
||||
{
|
||||
type_check = type_check_warn;
|
||||
type_mode = type_mode_manual;
|
||||
}
|
||||
else if (strcmp (type, "off") == 0)
|
||||
{
|
||||
type_check = type_check_off;
|
||||
type_mode = type_mode_manual;
|
||||
}
|
||||
else if (strcmp (type, "auto") == 0)
|
||||
{
|
||||
type_mode = type_mode_auto;
|
||||
set_type_range_case ();
|
||||
return;
|
||||
}
|
||||
else
|
||||
internal_error (__FILE__, __LINE__,
|
||||
_("Unrecognized type check setting: \"%s\""), type);
|
||||
|
||||
if (type_check != current_language->la_type_check)
|
||||
warning (_("the current type check setting"
|
||||
" does not match the language.\n"));
|
||||
}
|
||||
|
||||
/* Show command. Display a warning if the range setting does
|
||||
not match the current language. */
|
||||
static void
|
||||
@ -320,7 +245,7 @@ set_range_command (char *ignore, int from_tty, struct cmd_list_element *c)
|
||||
else if (strcmp (range, "auto") == 0)
|
||||
{
|
||||
range_mode = range_mode_auto;
|
||||
set_type_range_case ();
|
||||
set_range_case ();
|
||||
return;
|
||||
}
|
||||
else
|
||||
@ -389,7 +314,7 @@ set_case_command (char *ignore, int from_tty, struct cmd_list_element *c)
|
||||
else if (strcmp (case_sensitive, "auto") == 0)
|
||||
{
|
||||
case_mode = case_mode_auto;
|
||||
set_type_range_case ();
|
||||
set_range_case ();
|
||||
return;
|
||||
}
|
||||
else
|
||||
@ -409,14 +334,11 @@ set_case_command (char *ignore, int from_tty, struct cmd_list_element *c)
|
||||
If SHOW is non-zero, then print out the current language,
|
||||
type and range checking status. */
|
||||
static void
|
||||
set_type_range_case (void)
|
||||
set_range_case (void)
|
||||
{
|
||||
if (range_mode == range_mode_auto)
|
||||
range_check = current_language->la_range_check;
|
||||
|
||||
if (type_mode == type_mode_auto)
|
||||
type_check = current_language->la_type_check;
|
||||
|
||||
if (case_mode == case_mode_auto)
|
||||
case_sensitivity = current_language->la_case_sensitivity;
|
||||
}
|
||||
@ -437,7 +359,7 @@ set_language (enum language lang)
|
||||
if (languages[i]->la_language == lang)
|
||||
{
|
||||
current_language = languages[i];
|
||||
set_type_range_case ();
|
||||
set_range_case ();
|
||||
break;
|
||||
}
|
||||
}
|
||||
@ -461,8 +383,6 @@ language_info (int quietly)
|
||||
|
||||
if (!quietly)
|
||||
{
|
||||
printf_unfiltered (_("Type checking: %s\n"), type);
|
||||
show_type_command (NULL, 1, NULL, NULL);
|
||||
printf_unfiltered (_("Range checking: %s\n"), range);
|
||||
show_range_command (NULL, 1, NULL, NULL);
|
||||
printf_unfiltered (_("Case sensitivity: %s\n"), case_sensitive);
|
||||
@ -500,38 +420,11 @@ value_true (struct value *val)
|
||||
error messages that occur during type- and range-
|
||||
checking. */
|
||||
|
||||
/* These are called when a language fails a type- or range-check. The
|
||||
/* This is called when a language fails a range-check. The
|
||||
first argument should be a printf()-style format string, and the
|
||||
rest of the arguments should be its arguments. If
|
||||
[type|range]_check is [type|range]_check_on, an error is printed;
|
||||
if [type|range]_check_warn, a warning; otherwise just the
|
||||
message. */
|
||||
|
||||
void
|
||||
type_error (const char *string,...)
|
||||
{
|
||||
va_list args;
|
||||
|
||||
va_start (args, string);
|
||||
switch (type_check)
|
||||
{
|
||||
case type_check_warn:
|
||||
vwarning (string, args);
|
||||
break;
|
||||
case type_check_on:
|
||||
verror (string, args);
|
||||
break;
|
||||
case type_check_off:
|
||||
/* FIXME: cagney/2002-01-30: Should this function print anything
|
||||
when type error is off? */
|
||||
vfprintf_filtered (gdb_stderr, string, args);
|
||||
fprintf_filtered (gdb_stderr, "\n");
|
||||
break;
|
||||
default:
|
||||
internal_error (__FILE__, __LINE__, _("bad switch"));
|
||||
}
|
||||
va_end (args);
|
||||
}
|
||||
rest of the arguments should be its arguments. If range_check is
|
||||
range_check_on, an error is printed; if range_check_warn, a warning;
|
||||
otherwise just the message. */
|
||||
|
||||
void
|
||||
range_error (const char *string,...)
|
||||
@ -902,7 +795,6 @@ const struct language_defn unknown_language_defn =
|
||||
"unknown",
|
||||
language_unknown,
|
||||
range_check_off,
|
||||
type_check_off,
|
||||
case_sensitive_on,
|
||||
array_row_major,
|
||||
macro_expansion_no,
|
||||
@ -946,7 +838,6 @@ const struct language_defn auto_language_defn =
|
||||
"auto",
|
||||
language_auto,
|
||||
range_check_off,
|
||||
type_check_off,
|
||||
case_sensitive_on,
|
||||
array_row_major,
|
||||
macro_expansion_no,
|
||||
@ -988,7 +879,6 @@ const struct language_defn local_language_defn =
|
||||
"local",
|
||||
language_auto,
|
||||
range_check_off,
|
||||
type_check_off,
|
||||
case_sensitive_on,
|
||||
array_row_major,
|
||||
macro_expansion_no,
|
||||
@ -1135,13 +1025,6 @@ _initialize_language (void)
|
||||
add_alias_cmd ("c", "check", no_class, 1, &showlist);
|
||||
add_alias_cmd ("ch", "check", no_class, 1, &showlist);
|
||||
|
||||
add_setshow_enum_cmd ("type", class_support, type_or_range_names, &type,
|
||||
_("Set type checking. (on/warn/off/auto)"),
|
||||
_("Show type checking. (on/warn/off/auto)"),
|
||||
NULL, set_type_command,
|
||||
show_type_command,
|
||||
&setchecklist, &showchecklist);
|
||||
|
||||
add_setshow_enum_cmd ("range", class_support, type_or_range_names,
|
||||
&range,
|
||||
_("Set range checking. (on/warn/off/auto)"),
|
||||
|
@ -55,27 +55,6 @@ extern enum range_check
|
||||
}
|
||||
range_check;
|
||||
|
||||
/* type_mode ==
|
||||
type_mode_auto: type_check set automatically to default of language.
|
||||
type_mode_manual: type_check set manually by user. */
|
||||
|
||||
extern enum type_mode
|
||||
{
|
||||
type_mode_auto, type_mode_manual
|
||||
}
|
||||
type_mode;
|
||||
|
||||
/* type_check ==
|
||||
type_check_on: Types are checked in GDB expressions, producing errors.
|
||||
type_check_warn: Types are checked, producing warnings.
|
||||
type_check_off: Types are not checked in GDB expressions. */
|
||||
|
||||
extern enum type_check
|
||||
{
|
||||
type_check_off, type_check_warn, type_check_on
|
||||
}
|
||||
type_check;
|
||||
|
||||
/* case_mode ==
|
||||
case_mode_auto: case_sensitivity set upon selection of scope.
|
||||
case_mode_manual: case_sensitivity set only by user. */
|
||||
@ -162,10 +141,6 @@ struct language_defn
|
||||
|
||||
enum range_check la_range_check;
|
||||
|
||||
/* Default type checking. */
|
||||
|
||||
enum type_check la_type_check;
|
||||
|
||||
/* Default case sensitivity. */
|
||||
enum case_sensitivity la_case_sensitivity;
|
||||
|
||||
@ -422,9 +397,6 @@ struct type *language_lookup_primitive_type_by_name (const struct language_defn
|
||||
/* These macros define the behaviour of the expression
|
||||
evaluator. */
|
||||
|
||||
/* Should we strictly type check expressions? */
|
||||
#define STRICT_TYPE (type_check != type_check_off)
|
||||
|
||||
/* Should we range check values against the domain of their type? */
|
||||
#define RANGE_CHECK (range_check != range_check_off)
|
||||
|
||||
@ -496,8 +468,6 @@ extern void binop_type_check (struct value *, struct value *, int);
|
||||
|
||||
/* Error messages */
|
||||
|
||||
extern void type_error (const char *, ...) ATTRIBUTE_PRINTF (1, 2);
|
||||
|
||||
extern void range_error (const char *, ...) ATTRIBUTE_PRINTF (1, 2);
|
||||
|
||||
/* Data: Does this value represent "truth" to the current language? */
|
||||
|
@ -370,7 +370,6 @@ const struct language_defn m2_language_defn =
|
||||
"modula-2",
|
||||
language_m2,
|
||||
range_check_on,
|
||||
type_check_on,
|
||||
case_sensitive_on,
|
||||
array_row_major,
|
||||
macro_expansion_no,
|
||||
|
@ -509,7 +509,6 @@ const struct language_defn objc_language_defn = {
|
||||
"objective-c", /* Language name */
|
||||
language_objc,
|
||||
range_check_off,
|
||||
type_check_off,
|
||||
case_sensitive_on,
|
||||
array_row_major,
|
||||
macro_expansion_c,
|
||||
|
@ -993,7 +993,6 @@ const struct language_defn opencl_language_defn =
|
||||
"opencl", /* Language name */
|
||||
language_opencl,
|
||||
range_check_off,
|
||||
type_check_off,
|
||||
case_sensitive_on,
|
||||
array_row_major,
|
||||
macro_expansion_c,
|
||||
|
@ -429,7 +429,6 @@ const struct language_defn pascal_language_defn =
|
||||
"pascal", /* Language name */
|
||||
language_pascal,
|
||||
range_check_on,
|
||||
type_check_on,
|
||||
case_sensitive_on,
|
||||
array_row_major,
|
||||
macro_expansion_no,
|
||||
|
@ -1,3 +1,16 @@
|
||||
2012-08-17 Keith Seitz <keiths@redhat.com>
|
||||
|
||||
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.
|
||||
|
||||
2012-08-16 Mike Frysinger <vapier@gentoo.org>
|
||||
|
||||
* gdb.base/help.exp: Update expected output.
|
||||
|
@ -495,12 +495,13 @@ gdb_test "section" "Must specify section name and its virtual address.*" "sectio
|
||||
gdb_test "set annotate" "Argument required .integer to set it to.*" "set annotate"
|
||||
#test set args
|
||||
gdb_test_no_output "set args" "set args"
|
||||
#test set check "c" abbreviation
|
||||
gdb_test "set c" "\"set check\" must be followed by the name of a check subcommand.(\[^\r\n\]*\[\r\n\])+List of set check subcommands:(\[^\r\n\]*\[\r\n\])+set check range -- Set range checking(\[^\r\n\]*\[\r\n\])+set check type -- Set type checking(\[^\r\n\]*\[\r\n\])+Type \"help set check\" followed by set check subcommand name for full documentation.(\[^\r\n\]*\[\r\n\])+Command name abbreviations are allowed if unambiguous." "set check \"c\" abbreviation"
|
||||
#test set check "ch" abbreviation
|
||||
gdb_test "set ch" "\"set check\" must be followed by the name of a check subcommand.(\[^\r\n\]*\[\r\n\])+List of set check subcommands:(\[^\r\n\]*\[\r\n\])+set check range -- Set range checking(\[^\r\n\]*\[\r\n\])+set check type -- Set type checking(\[^\r\n\]*\[\r\n\])+Type \"help set check\" followed by set check subcommand name for full documentation.(\[^\r\n\]*\[\r\n\])+Command name abbreviations are allowed if unambiguous." "set check \"ch\" abbreviation"
|
||||
#test set check
|
||||
gdb_test "set check" "\"set check\" must be followed by the name of a check subcommand.(\[^\r\n\]*\[\r\n\])+List of set check subcommands:(\[^\r\n\]*\[\r\n\])+set check range -- Set range checking(\[^\r\n\]*\[\r\n\])+set check type -- Set type checking(\[^\r\n\]*\[\r\n\])+Type \"help set check\" followed by set check subcommand name for full documentation.(\[^\r\n\]*\[\r\n\])+Command name abbreviations are allowed if unambiguous." "set check"
|
||||
|
||||
# Test set check abbreviations
|
||||
foreach x {"c" "ch" "check"} {
|
||||
gdb_test "set $x" "\"set check\" must be followed by the name of a check subcommand.(\[^\r\n\]*\[\r\n\])+List of set check subcommands:(\[^\r\n\]*\[\r\n\])+set check range -- Set range checking(\[^\r\n\]*\[\r\n\])+set check type -- Set strict type checking(\[^\r\n\]*\[\r\n\])+Type \"help set check\" followed by set check subcommand name for full documentation.(\[^\r\n\]*\[\r\n\])+Command name abbreviations are allowed if unambiguous." \
|
||||
"set check \"$x\" abbreviation"
|
||||
}
|
||||
|
||||
#test set check range
|
||||
gdb_test "set check range" ".*" "set check range"
|
||||
#test set check type
|
||||
@ -577,16 +578,17 @@ gdb_test "shell echo Hi dad!" "Hi dad!" "shell echo Hi dad!"
|
||||
gdb_test "show annotate" "Annotation_level is 0." "show annotate"
|
||||
#test show args
|
||||
gdb_test "show args" "Argument list to give program being debugged when it is started is \"\"." "show args"
|
||||
#test show check "c" abbreviation
|
||||
gdb_test "show c" "range: *Range checking is \"auto; currently off\".(\[^\r\n\]*\[\r\n\])+type: *Type checking is \"auto; currently off\".*" "show check \"c\" abbreviation"
|
||||
#test show check "ch" abbreviation
|
||||
gdb_test "show ch" "range: *Range checking is \"auto; currently off\".(\[^\r\n\]*\[\r\n\])+type: *Type checking is \"auto; currently off\"." "show check \"ch\" abbreviation"
|
||||
#test show check
|
||||
gdb_test "show check" "range: *Range checking is \"auto; currently off\".(\[^\r\n\]*\[\r\n\])+type: *Type checking is \"auto; currently off\"." "show check"
|
||||
|
||||
# test show check abbreviations
|
||||
foreach x {"c" "ch" "check"} {
|
||||
gdb_test "show $x" "range: *Range checking is \"auto; currently off\".(\[^\r\n\]*\[\r\n\])+type: *Strict type checking is on\..*" \
|
||||
"show check \"$x\" abbreviation"
|
||||
}
|
||||
|
||||
#test show check range
|
||||
gdb_test "show check range" "Range checking is \"auto; currently off\"." "show check range"
|
||||
#test show check type
|
||||
gdb_test "show check type" "Type checking is \"auto; currently off\"." "show check type"
|
||||
gdb_test "show check type" "Strict type checking is on\." "show check type"
|
||||
#test show commands
|
||||
gdb_test "show commands" ".*" "show commands"
|
||||
#test show complaints
|
||||
|
@ -376,22 +376,26 @@ gdb_test "help section" "Change the base address of section SECTION of the exec
|
||||
gdb_test "help set annotate" "Set annotation_level\.\[\r\n\]+0 == normal; 1 == fullname \\(for use when running under emacs\\)\[\r\n\]+2 == output annotated suitably for use by programs that control GDB\." "help set annotate"
|
||||
# test help set args
|
||||
gdb_test "help set args" "Set argument list to give program being debugged when it is started\.\[\r\n\]+Follow this command with any number of args, to be passed to the program\."
|
||||
# test help set check "c" abbreviation
|
||||
test_prefix_command_help {"set c" "set check"} {
|
||||
"Set the status of the type/range checker\.\[\r\n\]+"
|
||||
} "help set check \"c\" abbreviation"
|
||||
# test help set check "ch" abbreviation
|
||||
test_prefix_command_help {"set ch" "set check"} {
|
||||
"Set the status of the type/range checker\.\[\r\n\]+"
|
||||
} "help set check \"ch\" abbreviation"
|
||||
# test help set check
|
||||
|
||||
# Test help set check abbreviations
|
||||
foreach x {"c" "ch"} {
|
||||
test_prefix_command_help [list "set $x" "set check"] {
|
||||
"Set the status of the type/range checker\.\[\r\n\]+"
|
||||
} "help set check \"$x\" abbreviation"
|
||||
}
|
||||
|
||||
# Test help set check
|
||||
test_prefix_command_help {"set check"} {
|
||||
"Set the status of the type/range checker\.\[\r\n\]+"
|
||||
}
|
||||
|
||||
# test help set check range
|
||||
gdb_test "help set check range" "Set range checking\. \\(on/warn/off/auto\\)" "help set check range"
|
||||
# test help set check type
|
||||
gdb_test "help set check type" "Set type checking\. \\(on/warn/off/auto\\)." "help set check type"
|
||||
|
||||
# Test help set check type
|
||||
gdb_test "help set check type" "Set strict type checking\." \
|
||||
"help set check type"
|
||||
|
||||
# test help set complaints
|
||||
gdb_test "help set complaints" "Set max number of complaints about incorrect symbols\." "help set complaints"
|
||||
# test help set confirm
|
||||
@ -487,18 +491,25 @@ gdb_test "help shell" "Execute the rest of the line as a shell command\.\[\r\n\]
|
||||
gdb_test "help show annotate" "Show annotation_level\.\[\r\n\]+0 == normal; 1 == fullname \\(for use when running under emacs\\)\[\r\n\]+2 == output annotated suitably for use by programs that control GDB\." "help show annotate"
|
||||
# test help show args
|
||||
gdb_test "help show args" "Show argument list to give program being debugged when it is started\.\[\r\n\]+Follow this command with any number of args, to be passed to the program\."
|
||||
# test help show check "c" abbreviation
|
||||
test_prefix_command_help {"show c" "show check"} {
|
||||
"Show the status of the type/range checker\.\[\r\n\]+"
|
||||
} "help show check \"c\" abbreviation"
|
||||
|
||||
# Test help show check abbreviations
|
||||
foreach x {"c" "check"} {
|
||||
test_prefix_command_help [list "show $x" "show check"] {
|
||||
"Show the status of the type/range checker\.\[\r\n\]+"
|
||||
} "help show check \"$x\" abbreviation"
|
||||
}
|
||||
|
||||
# test help show check
|
||||
test_prefix_command_help {"show check"} {
|
||||
"Show the status of the type/range checker\.\[\r\n\]+"
|
||||
}
|
||||
# test help show check range
|
||||
gdb_test "help show check range" "Show range checking\. \\(on/warn/off/auto\\)" "help show check range"
|
||||
|
||||
# test help show check type
|
||||
gdb_test "help show check type" "Show type checking\. \\(on/warn/off/auto\\)" "help show check type"
|
||||
gdb_test "help show check type" "Show strict type checking\." \
|
||||
"help show check type"
|
||||
|
||||
# test help show commands
|
||||
gdb_test "help show commands" "Show the history of commands you typed\.\[\r\n\]+You can supply a command number to start with, or a `\[+\]' to start after\[\r\n\]+the previous command number shown\." "help show commands"
|
||||
# test help show complaints
|
||||
|
@ -114,19 +114,22 @@ gdb_test "show check range" "Range checking is \"off\"\..*" "show check range (o
|
||||
#test set check range auto
|
||||
gdb_test_no_output "set check range auto" "set check range auto"
|
||||
#test show check range auto
|
||||
gdb_test "show check range" "Range checking is \"auto; currently .*" "show check range (auto)"
|
||||
#test set check type on
|
||||
gdb_test "set check type on" ".*" "set check type on"
|
||||
#test show check type on
|
||||
gdb_test "show check type" "Type checking is \"on\"..*" "show check type (on)"
|
||||
#test set check type off with trailing space
|
||||
gdb_test_no_output "set check type off " "set check type off"
|
||||
#test show check type off
|
||||
gdb_test "show check type" "Type checking is \"off\"..*" "show check type (off)"
|
||||
#test set check type auto
|
||||
gdb_test_no_output "set check type auto" "set check type auto"
|
||||
#test show check type
|
||||
gdb_test "show check type" "Type checking is \"auto; currently .*" "show check type (auto)"
|
||||
gdb_test "show check range" "Range checking is \"auto; currently .*" "show check range (auto)"
|
||||
|
||||
# Test set check type on
|
||||
gdb_test "set check type on" ".*" "set check type on"
|
||||
|
||||
# Test show check type on
|
||||
gdb_test "show check type" "Strict type checking is on\..*" \
|
||||
"show check type (on)"
|
||||
|
||||
# Test set check type off with trailing space
|
||||
gdb_test_no_output "set check type off " "set check type off"
|
||||
|
||||
# Test show check type off
|
||||
gdb_test "show check type" "Strict type checking is off\..*" \
|
||||
"show check type (off)"
|
||||
|
||||
#test set complaints 100
|
||||
gdb_test_no_output "set complaints 100" "set complaints 100"
|
||||
#test show complaints 100
|
||||
|
@ -27,6 +27,10 @@ int foo3_1 (int a, const char **b) { return 31; }
|
||||
int foo3_2 (int a, int b) { return 32; }
|
||||
int foo3_2 (int a, const char **b) { return 320; }
|
||||
|
||||
int foo1_type_check (char *a) { return 1000; }
|
||||
int foo2_type_check (char *a, char *b) { return 1001; }
|
||||
int foo3_type_check (char *a, char *b, char *c) { return 1002; }
|
||||
|
||||
int main()
|
||||
{
|
||||
|
||||
@ -62,5 +66,9 @@ int main()
|
||||
foo3_2 (0, static_cast<char const**> (0));
|
||||
foo3_2 (0, 0);
|
||||
|
||||
foo1_type_check (a);
|
||||
foo2_type_check (a, a);
|
||||
foo3_type_check (a, a, a);
|
||||
|
||||
return 0; // end of main
|
||||
}
|
||||
|
@ -70,9 +70,37 @@ gdb_test_multiple "p foo3_1 (0, 0)" $t {
|
||||
pass $t
|
||||
}
|
||||
}
|
||||
|
||||
gdb_test "p foo3_1 (0, 1)" \
|
||||
"Cannot resolve function foo3_1 to any overloaded instance"
|
||||
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"
|
||||
|
||||
# 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\."
|
||||
gdb_test "p foo1_type_check (123)" [format $error_str "foo1_type_check"]
|
||||
gdb_test "p foo2_type_check (0, 1)" [format $error_str "foo2_type_check"]
|
||||
gdb_test "p foo2_type_check (1, 0)" [format $error_str "foo2_type_check"]
|
||||
gdb_test "p foo2_type_check (1, 1)" [format $error_str "foo2_type_check"]
|
||||
gdb_test "p foo3_type_check (0, 0, 1)" [format $error_str "foo3_type_check"]
|
||||
gdb_test "p foo3_type_check (0, 1, 0)" [format $error_str "foo3_type_check"]
|
||||
gdb_test "p foo3_type_check (1, 0, 0)" [format $error_str "foo3_type_check"]
|
||||
gdb_test "p foo3_type_check (0, 1, 1)" [format $error_str "foo3_type_check"]
|
||||
gdb_test "p foo3_type_check (1, 1, 0)" [format $error_str "foo3_type_check"]
|
||||
gdb_test "p foo3_type_check (1, 1, 1)" [format $error_str "foo3_type_check"]
|
||||
|
||||
gdb_test_no_output "set check type off"
|
||||
gdb_test "show check type" "Strict type checking is off\."
|
||||
gdb_test "p foo1_type_check (123)" " = 1000"
|
||||
gdb_test "p foo2_type_check (0, 1)" " = 1001"
|
||||
gdb_test "p foo2_type_check (1, 0)" " = 1001"
|
||||
gdb_test "p foo2_type_check (1, 1)" " = 1001"
|
||||
gdb_test "p foo3_type_check (0, 0, 1)" " = 1002"
|
||||
gdb_test "p foo3_type_check (0, 1, 0)" " = 1002"
|
||||
gdb_test "p foo3_type_check (1, 0, 0)" " = 1002"
|
||||
gdb_test "p foo3_type_check (0, 1, 1)" " = 1002"
|
||||
gdb_test "p foo3_type_check (1, 1, 0)" " = 1002"
|
||||
gdb_test "p foo3_type_check (1, 1, 1)" " = 1002"
|
||||
gdb_test "p foo3_2 (1,1)" " = 32"
|
||||
|
Loading…
Reference in New Issue
Block a user