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:
Keith Seitz 2012-08-17 17:37:03 +00:00
parent 7b458c12dc
commit a451cb65e3
23 changed files with 243 additions and 301 deletions

View File

@ -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.

View File

@ -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,

View File

@ -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,

View File

@ -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,

View File

@ -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

View File

@ -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

View File

@ -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,

View File

@ -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);
}

View File

@ -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);

View File

@ -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,

View File

@ -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,

View File

@ -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)"),

View File

@ -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? */

View File

@ -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,

View File

@ -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,

View File

@ -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,

View File

@ -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,

View File

@ -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.

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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
}

View File

@ -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"