diff options
author | mueller <mueller@138bc75d-0d04-0410-961f-82ee72b054a4> | 2006-10-30 23:15:42 +0000 |
---|---|---|
committer | mueller <mueller@138bc75d-0d04-0410-961f-82ee72b054a4> | 2006-10-30 23:15:42 +0000 |
commit | 3f08e399af88be2efbeb9d5769ef3891b4633102 (patch) | |
tree | c6184d67a07b7d5535a9f3989cc07f65cb9eace4 /gcc | |
parent | 82cae756aba72dc929e7ba4c886fca908d0bb9a9 (diff) | |
download | gcc-3f08e399af88be2efbeb9d5769ef3891b4633102.tar.gz |
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.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@118206 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/c-common.c | 55 | ||||
-rw-r--r-- | gcc/c-common.h | 3 | ||||
-rw-r--r-- | gcc/c-decl.c | 45 | ||||
-rw-r--r-- | gcc/cp/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/cp/decl.c | 1 |
6 files changed, 69 insertions, 47 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 87126bd54e0..93ce3426685 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -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 diff --git a/gcc/c-common.c b/gcc/c-common.c index e51de2d7341..a901aba2f50 100644 --- a/gcc/c-common.c +++ b/gcc/c-common.c @@ -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). */ diff --git a/gcc/c-common.h b/gcc/c-common.h index 633990a3a35..f6f36e0114f 100644 --- a/gcc/c-common.h +++ b/gcc/c-common.h @@ -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); diff --git a/gcc/c-decl.c b/gcc/c-decl.c index e740fcac917..7ebb8b9c4f1 100644 --- a/gcc/c-decl.c +++ b/gcc/c-decl.c @@ -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); diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index b705968d04c..ad1f12681e5 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,10 @@ 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 * decl.c (grokfndecl): Duplicate warning message for easier translation. diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index 2645da28295..846089b52c1 100644 --- a/gcc/cp/decl.c +++ b/gcc/cp/decl.c @@ -6027,6 +6027,7 @@ grokfndecl (tree ctype, oldtypeargs); TREE_TYPE (decl) = newtype; } + check_main_parameter_types (decl); inlinep = 0; publicp = 1; } |