+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
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);
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
+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
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
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;
}
*slot = 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. */
{
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;
/* 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)
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);
}
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);
+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
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)