diff options
author | Manuel López-Ibáñez <manu@gcc.gnu.org> | 2008-08-08 23:57:19 +0000 |
---|---|---|
committer | Manuel López-Ibáñez <manu@gcc.gnu.org> | 2008-08-08 23:57:19 +0000 |
commit | 71205d170c59ae70323aa7d0b93ff5c13044fd57 (patch) | |
tree | 1c66246c77f4b33adec6eca15965b1e2f0bfa4bf /gcc/c-decl.c | |
parent | c73d5dd948d68fb2550f7d178d1483aebcfbcaea (diff) | |
download | gcc-71205d170c59ae70323aa7d0b93ff5c13044fd57.zip gcc-71205d170c59ae70323aa7d0b93ff5c13044fd57.tar.gz gcc-71205d170c59ae70323aa7d0b93ff5c13044fd57.tar.bz2 |
re PR other/36901 (pedwarn() + -pedantic-errors + -w (inhibit_warnings) should not emit errors)
2008-08-09 Manuel Lopez-Ibanez <manu@gcc.gnu.org>
PR 36901
* diagnostic.def (DK_PEDWARN, DK_PERMERROR): New.
* diagnostic.c (pedantic_warning_kind, permissive_error_kind):
Moved from diagnostic.h
(diagnostic_report_diagnostic): Return bool. Handle DK_PEDWARN and
DK_PERMERROR.
(emit_diagnostic): New.
(warning0, pedwarn0): Delete.
(warning, warning_at, pedwarn, permerror): Return bool.
* diagnostic.h (pedantic_warning_kind, permissive_error_kind):
Moved to diagnostic.c.
(struct diagnostic_context): Use correct type for
classify_diagnostic.
(diagnostic_report_diagnostic): Update declaration.
(emit_diagnostic): Declare.
* errors.c (warning): Return bool.
* errors.h (warning): Update declaration.
* toplev.h (warning0, pedwarn0): Delete.
(warning, warning_at, pedwarn, permerror): Return bool.
* c-errors.c (pedwarn_c99, pedwarn_c90): Use DK_PEDWARN.
* c-decl.c (locate_old_decl): Delete 'diag' argument. Always use
inform. Update all calls.
(diagnose_mismatched_decls): Check return value of warning/pedwarn
before giving informative note.
(implicit_decl_warning): Likewise.
* c-typeck.c (build_function_call): Likewise.
* tree-sssa.c (warn_uninit): Likewise.
* builtins.c (gimplify_va_arg_expr): Likewise.
fortran/
* f95-lang.c (gfc_mark_addressable): Use "pedwarn (0," instead of
'pedwarn0'.
cp/
* cp-tree.h (struct diagnostic_context, struct diagnostic_info):
Delete forward declarations. Check that toplev.h has not been
included before this file. Include toplev.h and diagnostic.h.
* error.c (cp_cpp_error): Use DK_PEDWARN.
(cxx_incomplete_type_diagnostic): Update declaration.
(cxx_incomplete_type_error): Use DK_ERROR.
* typeck2.c (cxx_incomplete_type_diagnostic): Take a diagnostic_t
as argument. Use emit_diagnostic.
(cxx_incomplete_type_error): Use DK_ERROR.
(add_exception_specifier): Use diagnostic_t instead of custom
codes.
* typeck.c (complete_type_or_else): Update call to
cxx_incomplete_type_diagnostic.
* init.c (build_delete): Likewise.
* call.c (diagnostic_fn_t): Remove unused typedef.
(build_temp): Pass a pointer to diagnostic_t.
(convert_like_real): Use emit_diagnostic.
(joust): Check return value of warning before giving informative
note.
* friend.c (do_friend): Check return value of warning
before giving informative note.
* parser.c (cp_parser_template_id): Likewise.
testsuite/
* gcc.dg/pr36901-1.c: New.
* gcc.dg/pr36901-3.c: New.
* gcc.dg/pr36901-2.c: New.
* gcc.dg/pr36901-4.c: New.
* gcc.dg/pr36901-system.h: New.
* gcc.dg/pr36901.h: New.
* gcc.target/powerpc/altivec-macros.c: Update.
* gcc.target/i386/regparm.c: Update.
* gcc.dg/funcdef-var-1.c: Update.
* gcc.dg/parm-mismatch-1.c: Update.
* gcc.dg/attr-noinline.c: Update.
* gcc.dg/wtr-static-1.c: Update.
* gcc.dg/redecl-11.c: Update.
* gcc.dg/pr27953.c: Update.
* gcc.dg/proto-1.c: Update.
* gcc.dg/decl-3.c: Update.
* gcc.dg/redecl-13.c: Update.
* gcc.dg/pr15360-1.c: Update.
* gcc.dg/redecl-15.c: Update.
* gcc.dg/enum-compat-1.c: Update.
* gcc.dg/dll-3.c: Update.
* gcc.dg/array-5.c: Update.
* gcc.dg/Wredundant-decls-2.c: Update.
* gcc.dg/inline4.c: Update.
* gcc.dg/redecl-2.c: Update.
* gcc.dg/inline-14.c: Update.
* gcc.dg/tls/diag-3.c: Update.
* gcc.dg/funcdef-var-2.c: Update.
* gcc.dg/20041213-1.c: Update.
* gcc.dg/old-style-then-proto-1.c: Update.
* gcc.dg/decl-2.c: Update.
* gcc.dg/redecl-12.c: Update.
* gcc.dg/decl-4.c: Update.
* gcc.dg/Wshadow-1.c: Update.
* gcc.dg/transparent-union-2.c: Update.
* gcc.dg/visibility-7.c: Update.
* gcc.dg/dll-2.c: Update.
* gcc.dg/redecl-16.c: Update.
* gcc.dg/inline1.c: Update.
* gcc.dg/decl-8.c: Update.
* gcc.dg/nested-redef-1.c: Update.
* gcc.dg/inline3.c: Update.
* gcc.dg/redecl-1.c: Update.
* gcc.dg/inline5.c: Update.
* gcc.dg/pr35899.c: Update.
* gcc.dg/noncompile/label-lineno-1.c: Update.
* gcc.dg/noncompile/label-1.c: Update.
* gcc.dg/noncompile/20020220-1.c: Update.
* gcc.dg/noncompile/redecl-1.c: Update.
* gcc.dg/redecl-5.c: Update.
* gcc.dg/qual-return-3.c: Update.
* gcc.dg/label-decl-4.c: Update.
From-SVN: r138893
Diffstat (limited to 'gcc/c-decl.c')
-rw-r--r-- | gcc/c-decl.c | 102 |
1 files changed, 50 insertions, 52 deletions
diff --git a/gcc/c-decl.c b/gcc/c-decl.c index ff23f6e..e30defd 100644 --- a/gcc/c-decl.c +++ b/gcc/c-decl.c @@ -1115,16 +1115,16 @@ validate_proto_after_old_defn (tree newdecl, tree newtype, tree oldtype) first in a pair of mismatched declarations, using the diagnostic function DIAG. */ static void -locate_old_decl (tree decl, void (*diag)(const char *, ...) ATTRIBUTE_GCC_CDIAG(1,2)) +locate_old_decl (tree decl) { if (TREE_CODE (decl) == FUNCTION_DECL && DECL_BUILT_IN (decl)) ; else if (DECL_INITIAL (decl)) - diag (G_("previous definition of %q+D was here"), decl); + inform ("previous definition of %q+D was here", decl); else if (C_DECL_IMPLICIT (decl)) - diag (G_("previous implicit declaration of %q+D was here"), decl); + inform ("previous implicit declaration of %q+D was here", decl); else - diag (G_("previous declaration of %q+D was here"), decl); + inform ("previous declaration of %q+D was here", decl); } /* Subroutine of duplicate_decls. Compare NEWDECL to OLDDECL. @@ -1165,7 +1165,7 @@ diagnose_mismatched_decls (tree newdecl, tree olddecl, && !C_DECL_DECLARED_BUILTIN (olddecl))) { error ("%q+D redeclared as different kind of symbol", newdecl); - locate_old_decl (olddecl, error); + locate_old_decl (olddecl); } else if (TREE_PUBLIC (newdecl)) warning (0, "built-in function %q+D declared as non-function", @@ -1181,7 +1181,7 @@ diagnose_mismatched_decls (tree newdecl, tree olddecl, if (TREE_CODE (olddecl) == CONST_DECL) { error ("redeclaration of enumerator %q+D", newdecl); - locate_old_decl (olddecl, error); + locate_old_decl (olddecl); return false; } @@ -1225,11 +1225,10 @@ diagnose_mismatched_decls (tree newdecl, tree olddecl, && TYPE_MAIN_VARIANT (TREE_TYPE (newtype)) == integer_type_node && C_FUNCTION_IMPLICIT_INT (newdecl) && !DECL_INITIAL (olddecl)) { - pedwarn (0, "conflicting types for %q+D", newdecl); + pedwarned = pedwarn (0, "conflicting types for %q+D", newdecl); /* Make sure we keep void as the return type. */ TREE_TYPE (newdecl) = *newtypep = newtype = oldtype; C_FUNCTION_IMPLICIT_INT (newdecl) = 0; - pedwarned = true; } /* Permit void foo (...) to match an earlier call to foo (...) with no declared type (thus, implicitly int). */ @@ -1238,10 +1237,9 @@ diagnose_mismatched_decls (tree newdecl, tree olddecl, && TYPE_MAIN_VARIANT (TREE_TYPE (oldtype)) == integer_type_node && C_DECL_IMPLICIT (olddecl) && !DECL_INITIAL (olddecl)) { - pedwarn (0, "conflicting types for %q+D", newdecl); + pedwarned = pedwarn (0, "conflicting types for %q+D", newdecl); /* Make sure we keep void as the return type. */ TREE_TYPE (olddecl) = *oldtypep = oldtype = newtype; - pedwarned = true; } else { @@ -1250,7 +1248,7 @@ diagnose_mismatched_decls (tree newdecl, tree olddecl, else error ("conflicting types for %q+D", newdecl); diagnose_arglist_conflict (newdecl, olddecl, newtype, oldtype); - locate_old_decl (olddecl, error); + locate_old_decl (olddecl); return false; } } @@ -1267,7 +1265,7 @@ diagnose_mismatched_decls (tree newdecl, tree olddecl, return true; /* Allow OLDDECL to continue in use. */ error ("redefinition of typedef %q+D", newdecl); - locate_old_decl (olddecl, error); + locate_old_decl (olddecl); return false; } @@ -1318,7 +1316,7 @@ diagnose_mismatched_decls (tree newdecl, tree olddecl, && same_translation_unit_p (newdecl, olddecl)) { error ("redefinition of %q+D", newdecl); - locate_old_decl (olddecl, error); + locate_old_decl (olddecl); return false; } } @@ -1330,7 +1328,7 @@ diagnose_mismatched_decls (tree newdecl, tree olddecl, && TYPE_ACTUAL_ARG_TYPES (oldtype) && !validate_proto_after_old_defn (newdecl, newtype, oldtype)) { - locate_old_decl (olddecl, error); + locate_old_decl (olddecl); return false; } /* A non-static declaration (even an "extern") followed by a @@ -1354,7 +1352,7 @@ diagnose_mismatched_decls (tree newdecl, tree olddecl, { error ("static declaration of %q+D follows " "non-static declaration", newdecl); - locate_old_decl (olddecl, error); + locate_old_decl (olddecl); } return false; } @@ -1364,14 +1362,14 @@ diagnose_mismatched_decls (tree newdecl, tree olddecl, { error ("non-static declaration of %q+D follows " "static declaration", newdecl); - locate_old_decl (olddecl, error); + locate_old_decl (olddecl); return false; } else if (warn_traditional) { - warning (OPT_Wtraditional, "non-static declaration of %q+D " - "follows static declaration", newdecl); - warned = true; + warned |= warning (OPT_Wtraditional, + "non-static declaration of %q+D " + "follows static declaration", newdecl); } } @@ -1412,7 +1410,7 @@ diagnose_mismatched_decls (tree newdecl, tree olddecl, error ("non-thread-local declaration of %q+D follows " "thread-local declaration", newdecl); - locate_old_decl (olddecl, error); + locate_old_decl (olddecl); return false; } @@ -1420,7 +1418,7 @@ diagnose_mismatched_decls (tree newdecl, tree olddecl, if (DECL_INITIAL (newdecl) && DECL_INITIAL (olddecl)) { error ("redefinition of %q+D", newdecl); - locate_old_decl (olddecl, error); + locate_old_decl (olddecl); return false; } @@ -1441,14 +1439,14 @@ diagnose_mismatched_decls (tree newdecl, tree olddecl, { error ("extern declaration of %q+D follows " "declaration with no linkage", newdecl); - locate_old_decl (olddecl, error); + locate_old_decl (olddecl); return false; } else if (warn_traditional) { - warning (OPT_Wtraditional, "non-static declaration of %q+D " - "follows static declaration", newdecl); - warned = true; + warned |= warning (OPT_Wtraditional, + "non-static declaration of %q+D " + "follows static declaration", newdecl); } } else @@ -1460,7 +1458,7 @@ diagnose_mismatched_decls (tree newdecl, tree olddecl, error ("static declaration of %q+D follows " "non-static declaration", newdecl); - locate_old_decl (olddecl, error); + locate_old_decl (olddecl); return false; } } @@ -1477,12 +1475,12 @@ diagnose_mismatched_decls (tree newdecl, tree olddecl, { error ("declaration of %q+D with no linkage follows " "extern declaration", newdecl); - locate_old_decl (olddecl, error); + locate_old_decl (olddecl); } else { error ("redeclaration of %q+D with no linkage", newdecl); - locate_old_decl (olddecl, error); + locate_old_decl (olddecl); } return false; @@ -1495,9 +1493,8 @@ diagnose_mismatched_decls (tree newdecl, tree olddecl, && DECL_VISIBILITY_SPECIFIED (newdecl) && DECL_VISIBILITY_SPECIFIED (olddecl) && DECL_VISIBILITY (newdecl) != DECL_VISIBILITY (olddecl)) { - warning (0, "redeclaration of %q+D with different visibility " - "(old visibility preserved)", newdecl); - warned = true; + warned |= warning (0, "redeclaration of %q+D with different visibility " + "(old visibility preserved)", newdecl); } if (TREE_CODE (newdecl) == FUNCTION_DECL) @@ -1506,16 +1503,16 @@ diagnose_mismatched_decls (tree newdecl, tree olddecl, if (DECL_DECLARED_INLINE_P (newdecl) && lookup_attribute ("noinline", DECL_ATTRIBUTES (olddecl))) { - warning (OPT_Wattributes, "inline declaration of %qD follows " - "declaration with attribute noinline", newdecl); - warned = true; + warned |= warning (OPT_Wattributes, + "inline declaration of %qD follows " + "declaration with attribute noinline", newdecl); } else if (DECL_DECLARED_INLINE_P (olddecl) && lookup_attribute ("noinline", DECL_ATTRIBUTES (newdecl))) { - warning (OPT_Wattributes, "declaration of %q+D with attribute " - "noinline follows inline declaration ", newdecl); - warned = true; + warned |= warning (OPT_Wattributes, + "declaration of %q+D with attribute " + "noinline follows inline declaration ", newdecl); } } else /* PARM_DECL, VAR_DECL */ @@ -1533,7 +1530,7 @@ diagnose_mismatched_decls (tree newdecl, tree olddecl, && (!TREE_ASM_WRITTEN (olddecl) || TREE_ASM_WRITTEN (newdecl))) { error ("redefinition of parameter %q+D", newdecl); - locate_old_decl (olddecl, error); + locate_old_decl (olddecl); return false; } } @@ -1559,14 +1556,13 @@ diagnose_mismatched_decls (tree newdecl, tree olddecl, && !(TREE_CODE (newdecl) == VAR_DECL && DECL_INITIAL (newdecl) && !DECL_INITIAL (olddecl))) { - warning (OPT_Wredundant_decls, "redundant redeclaration of %q+D", - newdecl); - warned = true; + warned = warning (OPT_Wredundant_decls, "redundant redeclaration of %q+D", + newdecl); } - /* Report location of previous decl/defn in a consistent manner. */ + /* Report location of previous decl/defn. */ if (warned || pedwarned) - locate_old_decl (olddecl, pedwarned ? pedwarn0 : warning0); + locate_old_decl (olddecl); #undef DECL_EXTERN_INLINE @@ -2330,14 +2326,16 @@ implicit_decl_warning (tree id, tree olddecl) { if (warn_implicit_function_declaration) { + bool warned; + if (flag_isoc99) - pedwarn (OPT_Wimplicit_function_declaration, - G_("implicit declaration of function %qE"), id); + warned = pedwarn (OPT_Wimplicit_function_declaration, + G_("implicit declaration of function %qE"), id); else - warning (OPT_Wimplicit_function_declaration, - G_("implicit declaration of function %qE"), id); - if (olddecl) - locate_old_decl (olddecl, inform); + warned = warning (OPT_Wimplicit_function_declaration, + G_("implicit declaration of function %qE"), id); + if (olddecl && warned) + locate_old_decl (olddecl); } } @@ -2408,7 +2406,7 @@ implicitly_declare (tree functionid) { error ("incompatible implicit declaration of function %qD", decl); - locate_old_decl (decl, error); + locate_old_decl (decl); } } b->type = TREE_TYPE (decl); @@ -2550,7 +2548,7 @@ declare_label (tree name) if (b && B_IN_CURRENT_SCOPE (b)) { error ("duplicate label declaration %qE", name); - locate_old_decl (b->decl, error); + locate_old_decl (b->decl); /* Just use the previous declaration. */ return b->decl; @@ -2586,7 +2584,7 @@ define_label (location_t location, tree name) && C_DECLARED_LABEL_FLAG (label)))) { error ("%Hduplicate label %qD", &location, label); - locate_old_decl (label, error); + locate_old_decl (label); return 0; } else if (label && DECL_CONTEXT (label) == current_function_decl) |