aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
Diffstat (limited to 'gcc')
-rw-r--r--gcc/c-family/ChangeLog7
-rw-r--r--gcc/c-family/c-opts.c3
-rw-r--r--gcc/c-family/c.opt2
-rw-r--r--gcc/cp/ChangeLog12
-rw-r--r--gcc/cp/constexpr.c52
-rw-r--r--gcc/cp/cp-gimplify.c20
-rw-r--r--gcc/fortran/ChangeLog6
-rw-r--r--gcc/fortran/options.c3
8 files changed, 81 insertions, 24 deletions
diff --git a/gcc/c-family/ChangeLog b/gcc/c-family/ChangeLog
index e847642..373db2d 100644
--- a/gcc/c-family/ChangeLog
+++ b/gcc/c-family/ChangeLog
@@ -1,3 +1,10 @@
+2017-11-06 Martin Liska <mliska@suse.cz>
+
+ PR middle-end/82404
+ * c-opts.c (c_common_post_options): Set -Wreturn-type for C++
+ FE.
+ * c.opt: Set default value of warn_return_type.
+
2017-10-31 David Malcolm <dmalcolm@redhat.com>
* c-common.c (binary_op_error): Update for renaming of
diff --git a/gcc/c-family/c-opts.c b/gcc/c-family/c-opts.c
index 32120e6..cead15e 100644
--- a/gcc/c-family/c-opts.c
+++ b/gcc/c-family/c-opts.c
@@ -989,6 +989,9 @@ c_common_post_options (const char **pfilename)
flag_extern_tls_init = 1;
}
+ if (warn_return_type == -1)
+ warn_return_type = c_dialect_cxx ();
+
if (num_in_fnames > 1)
error ("too many filenames given. Type %s --help for usage",
progname);
diff --git a/gcc/c-family/c.opt b/gcc/c-family/c.opt
index dae124a..9ab31f0 100644
--- a/gcc/c-family/c.opt
+++ b/gcc/c-family/c.opt
@@ -960,7 +960,7 @@ C++ ObjC++ Var(warn_reorder) Warning LangEnabledBy(C++ ObjC++,Wall)
Warn when the compiler reorders code.
Wreturn-type
-C ObjC C++ ObjC++ Var(warn_return_type) Warning LangEnabledBy(C ObjC C++ ObjC++,Wall)
+C ObjC C++ ObjC++ Var(warn_return_type) Warning LangEnabledBy(C ObjC C++ ObjC++,Wall) Init(-1)
Warn whenever a function's return type defaults to \"int\" (C), or about inconsistent return types (C++).
Wscalar-storage-order
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 590e322..bb90b5a 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,15 @@
+2017-11-06 Martin Liska <mliska@suse.cz>
+
+ PR middle-end/82404
+ * constexpr.c (cxx_eval_builtin_function_call): Handle
+ __builtin_unreachable call.
+ (get_function_named_in_call): Declare function earlier.
+ (constexpr_fn_retval): Skip __builtin_unreachable.
+ * cp-gimplify.c (cp_ubsan_maybe_instrument_return): Rename to
+ ...
+ (cp_maybe_instrument_return): ... this.
+ (cp_genericize): Call the function unconditionally.
+
2017-11-03 Nathan Sidwell <nathan@acm.org>
PR c++/82710
diff --git a/gcc/cp/constexpr.c b/gcc/cp/constexpr.c
index 483f731..670aae2 100644
--- a/gcc/cp/constexpr.c
+++ b/gcc/cp/constexpr.c
@@ -628,6 +628,20 @@ build_constexpr_constructor_member_initializers (tree type, tree body)
return error_mark_node;
}
+/* We have an expression tree T that represents a call, either CALL_EXPR
+ or AGGR_INIT_EXPR. If the call is lexically to a named function,
+ retrun the _DECL for that function. */
+
+static tree
+get_function_named_in_call (tree t)
+{
+ tree fun = cp_get_callee (t);
+ if (fun && TREE_CODE (fun) == ADDR_EXPR
+ && TREE_CODE (TREE_OPERAND (fun, 0)) == FUNCTION_DECL)
+ fun = TREE_OPERAND (fun, 0);
+ return fun;
+}
+
/* Subroutine of register_constexpr_fundef. BODY is the body of a function
declared to be constexpr, or a sub-statement thereof. Returns the
return value if suitable, error_mark_node for a statement not allowed in
@@ -682,6 +696,15 @@ constexpr_fn_retval (tree body)
case USING_STMT:
return NULL_TREE;
+ case CALL_EXPR:
+ {
+ tree fun = get_function_named_in_call (body);
+ if (fun != NULL_TREE
+ && DECL_FUNCTION_CODE (fun) == BUILT_IN_UNREACHABLE)
+ return NULL_TREE;
+ }
+ /* Fallthru. */
+
default:
return error_mark_node;
}
@@ -1098,20 +1121,6 @@ save_fundef_copy (tree fun, tree copy)
}
/* We have an expression tree T that represents a call, either CALL_EXPR
- or AGGR_INIT_EXPR. If the call is lexically to a named function,
- retrun the _DECL for that function. */
-
-static tree
-get_function_named_in_call (tree t)
-{
- tree fun = cp_get_callee (t);
- if (fun && TREE_CODE (fun) == ADDR_EXPR
- && TREE_CODE (TREE_OPERAND (fun, 0)) == FUNCTION_DECL)
- fun = TREE_OPERAND (fun, 0);
- return fun;
-}
-
-/* We have an expression tree T that represents a call, either CALL_EXPR
or AGGR_INIT_EXPR. Return the Nth argument. */
static inline tree
@@ -1180,9 +1189,18 @@ cxx_eval_builtin_function_call (const constexpr_ctx *ctx, tree t, tree fun,
{
if (!*non_constant_p && !ctx->quiet)
{
- new_call = build_call_array_loc (EXPR_LOCATION (t), TREE_TYPE (t),
- CALL_EXPR_FN (t), nargs, args);
- error ("%q+E is not a constant expression", new_call);
+ /* Do not allow__builtin_unreachable in constexpr function.
+ The __builtin_unreachable call with BUILTINS_LOCATION
+ comes from cp_maybe_instrument_return. */
+ if (DECL_FUNCTION_CODE (fun) == BUILT_IN_UNREACHABLE
+ && EXPR_LOCATION (t) == BUILTINS_LOCATION)
+ error ("constexpr call flows off the end of the function");
+ else
+ {
+ new_call = build_call_array_loc (EXPR_LOCATION (t), TREE_TYPE (t),
+ CALL_EXPR_FN (t), nargs, args);
+ error ("%q+E is not a constant expression", new_call);
+ }
}
*non_constant_p = true;
return t;
diff --git a/gcc/cp/cp-gimplify.c b/gcc/cp/cp-gimplify.c
index 262485a..014c1ee 100644
--- a/gcc/cp/cp-gimplify.c
+++ b/gcc/cp/cp-gimplify.c
@@ -1556,10 +1556,11 @@ cp_genericize_tree (tree* t_p, bool handle_invisiref_parm_p)
/* If a function that should end with a return in non-void
function doesn't obviously end with return, add ubsan
- instrumentation code to verify it at runtime. */
+ instrumentation code to verify it at runtime. If -fsanitize=return
+ is not enabled, instrument __builtin_unreachable. */
static void
-cp_ubsan_maybe_instrument_return (tree fndecl)
+cp_maybe_instrument_return (tree fndecl)
{
if (VOID_TYPE_P (TREE_TYPE (TREE_TYPE (fndecl)))
|| DECL_CONSTRUCTOR_P (fndecl)
@@ -1600,7 +1601,16 @@ cp_ubsan_maybe_instrument_return (tree fndecl)
tree *p = &DECL_SAVED_TREE (fndecl);
if (TREE_CODE (*p) == BIND_EXPR)
p = &BIND_EXPR_BODY (*p);
- t = ubsan_instrument_return (DECL_SOURCE_LOCATION (fndecl));
+
+ location_t loc = DECL_SOURCE_LOCATION (fndecl);
+ if (sanitize_flags_p (SANITIZE_RETURN, fndecl))
+ t = ubsan_instrument_return (loc);
+ else
+ {
+ tree fndecl = builtin_decl_explicit (BUILT_IN_UNREACHABLE);
+ t = build_call_expr_loc (BUILTINS_LOCATION, fndecl, 0);
+ }
+
append_to_statement_list (t, p);
}
@@ -1674,9 +1684,7 @@ cp_genericize (tree fndecl)
walk_tree's hash functionality. */
cp_genericize_tree (&DECL_SAVED_TREE (fndecl), true);
- if (sanitize_flags_p (SANITIZE_RETURN)
- && current_function_decl != NULL_TREE)
- cp_ubsan_maybe_instrument_return (fndecl);
+ cp_maybe_instrument_return (fndecl);
/* Do everything else. */
c_genericize (fndecl);
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index 58ee3e5..1e40336 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -1,3 +1,9 @@
+2017-11-06 Martin Liska <mliska@suse.cz>
+
+ PR middle-end/82404
+ * options.c (gfc_post_options): Set default value of
+ -Wreturn-type to false.
+
2017-11-05 Thomas Koenig <tkoenig@gcc.gnu.org>
PR fortran/82471
diff --git a/gcc/fortran/options.c b/gcc/fortran/options.c
index 0ee6b78..c584a19 100644
--- a/gcc/fortran/options.c
+++ b/gcc/fortran/options.c
@@ -435,6 +435,9 @@ gfc_post_options (const char **pfilename)
gfc_fatal_error ("Maximum subrecord length cannot exceed %d",
MAX_SUBRECORD_LENGTH);
+ if (warn_return_type == -1)
+ warn_return_type = 0;
+
gfc_cpp_post_options ();
if (gfc_option.allow_std & GFC_STD_F2008)