aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDirk Mueller <dmueller@suse.de>2006-10-30 23:15:42 +0000
committerDirk Mueller <mueller@gcc.gnu.org>2006-10-30 23:15:42 +0000
commita1e45ff04c25fd5929f7a2fb8359856b53857df7 (patch)
treec6184d67a07b7d5535a9f3989cc07f65cb9eace4
parente7c41c9948c268fd3940be53ce8a988da8716406 (diff)
downloadgcc-a1e45ff04c25fd5929f7a2fb8359856b53857df7.zip
gcc-a1e45ff04c25fd5929f7a2fb8359856b53857df7.tar.gz
gcc-a1e45ff04c25fd5929f7a2fb8359856b53857df7.tar.bz2
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
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/c-common.c55
-rw-r--r--gcc/c-common.h3
-rw-r--r--gcc/c-decl.c45
-rw-r--r--gcc/cp/ChangeLog5
-rw-r--r--gcc/cp/decl.c1
6 files changed, 69 insertions, 47 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 87126bd..93ce342 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 e51de2d..a901aba 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 633990a..f6f36e0 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 e740fca..7ebb8b9 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 b705968..ad1f126 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 2645da2..846089b 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;
}