re PR c++/6321 (no warning for bad main function declaration)

2006-10-30  Dirk Mueller  <dmueller@suse.de>

        PR c++/6321
        * cp/decl.c (grokfndecl): Use check_main_parameter_types.

        * c-common.h (strict_aliasing_warning): Fix whitespace.
        * c-decl (start_function): Move code for main decl warning ..
        * c-common.c (check_main_parameter_types): .. here.
        * c-common.h (check_main_parameter_types): Declare.

From-SVN: r118206
This commit is contained in:
Dirk Mueller 2006-10-30 23:15:42 +00:00 committed by Dirk Mueller
parent e7c41c9948
commit a1e45ff04c
6 changed files with 69 additions and 47 deletions

View File

@ -1,3 +1,10 @@
2006-10-30 Dirk Mueller <dmueller@suse.de>
* c-common.h (strict_aliasing_warning): Fix whitespace.
* c-decl (start_function): Move code for main decl warning ..
* c-common.c (check_main_parameter_types): .. here.
* c-common.h (check_main_parameter_types): Declare.
2006-10-30 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
PR middle-end/29335

View File

@ -1010,7 +1010,6 @@ strict_aliasing_warning (tree otype, tree type, tree expr)
}
}
/* Print a warning about if (); or if () .. else; constructs
via the special empty statement node that we create. INNER_THEN
and INNER_ELSE are the statement lists of the if and the else
@ -1039,7 +1038,59 @@ empty_body_warning (tree inner_then, tree inner_else)
}
}
/* Warn for unlikely, improbable, or stupid DECL declarations
of `main'. */
void
check_main_parameter_types (tree decl)
{
tree args;
int argct = 0;
for (args = TYPE_ARG_TYPES (TREE_TYPE (decl)); args;
args = TREE_CHAIN (args))
{
tree type = args ? TREE_VALUE (args) : 0;
if (type == void_type_node)
break;
++argct;
switch (argct)
{
case 1:
if (TYPE_MAIN_VARIANT (type) != integer_type_node)
pedwarn ("first argument of %q+D should be %<int%>", decl);
break;
case 2:
if (TREE_CODE (type) != POINTER_TYPE
|| TREE_CODE (TREE_TYPE (type)) != POINTER_TYPE
|| (TYPE_MAIN_VARIANT (TREE_TYPE (TREE_TYPE (type)))
!= char_type_node))
pedwarn ("second argument of %q+D should be %<char **%>",
decl);
break;
case 3:
if (TREE_CODE (type) != POINTER_TYPE
|| TREE_CODE (TREE_TYPE (type)) != POINTER_TYPE
|| (TYPE_MAIN_VARIANT (TREE_TYPE (TREE_TYPE (type)))
!= char_type_node))
pedwarn ("third argument of %q+D should probably be "
"%<char **%>", decl);
break;
}
}
/* It is intentional that this message does not mention the third
argument because it's only mentioned in an appendix of the
standard. */
if (argct > 0 && (argct < 2 || argct > 3))
pedwarn ("%q+D takes only zero or two arguments", decl);
}
/* Nonzero if constant C has a value that is permissible
for type TYPE (an INTEGER_TYPE). */

View File

@ -654,10 +654,11 @@ extern void binary_op_error (enum tree_code);
extern tree fix_string_type (tree);
struct varray_head_tag;
extern void constant_expression_warning (tree);
extern void strict_aliasing_warning(tree, tree, tree);
extern void strict_aliasing_warning (tree, tree, tree);
extern void empty_body_warning (tree, tree);
extern tree convert_and_check (tree, tree);
extern void overflow_warning (tree);
extern void check_main_parameter_types (tree decl);
extern bool c_determine_visibility (tree);
extern bool same_scalar_type_ignoring_signedness (tree, tree);

View File

@ -6133,54 +6133,11 @@ start_function (struct c_declspecs *declspecs, struct c_declarator *declarator,
/* Warn for unlikely, improbable, or stupid declarations of `main'. */
if (warn_main > 0 && MAIN_NAME_P (DECL_NAME (decl1)))
{
tree args;
int argct = 0;
if (TYPE_MAIN_VARIANT (TREE_TYPE (TREE_TYPE (decl1)))
!= integer_type_node)
pedwarn ("return type of %q+D is not %<int%>", decl1);
for (args = TYPE_ARG_TYPES (TREE_TYPE (decl1)); args;
args = TREE_CHAIN (args))
{
tree type = args ? TREE_VALUE (args) : 0;
if (type == void_type_node)
break;
++argct;
switch (argct)
{
case 1:
if (TYPE_MAIN_VARIANT (type) != integer_type_node)
pedwarn ("first argument of %q+D should be %<int%>", decl1);
break;
case 2:
if (TREE_CODE (type) != POINTER_TYPE
|| TREE_CODE (TREE_TYPE (type)) != POINTER_TYPE
|| (TYPE_MAIN_VARIANT (TREE_TYPE (TREE_TYPE (type)))
!= char_type_node))
pedwarn ("second argument of %q+D should be %<char **%>",
decl1);
break;
case 3:
if (TREE_CODE (type) != POINTER_TYPE
|| TREE_CODE (TREE_TYPE (type)) != POINTER_TYPE
|| (TYPE_MAIN_VARIANT (TREE_TYPE (TREE_TYPE (type)))
!= char_type_node))
pedwarn ("third argument of %q+D should probably be "
"%<char **%>", decl1);
break;
}
}
/* It is intentional that this message does not mention the third
argument because it's only mentioned in an appendix of the
standard. */
if (argct > 0 && (argct < 2 || argct > 3))
pedwarn ("%q+D takes only zero or two arguments", decl1);
check_main_parameter_types(decl1);
if (!TREE_PUBLIC (decl1))
pedwarn ("%q+D is normally a non-static function", decl1);

View File

@ -1,3 +1,8 @@
2006-10-30 Dirk Mueller <dmueller@suse.de>
PR c++/6321
* decl.c (grokfndecl): Use check_main_parameter_types.
2006-10-30 Dirk Mueller <dmueller@suse.de>
PR c++/28669

View File

@ -6027,6 +6027,7 @@ grokfndecl (tree ctype,
oldtypeargs);
TREE_TYPE (decl) = newtype;
}
check_main_parameter_types (decl);
inlinep = 0;
publicp = 1;
}