Commit 17366700 by Jakub Jelinek Committed by Jakub Jelinek

re PR tree-optimization/70144 (g++ ICE at -O1 and above on valid code on…

re PR tree-optimization/70144 (g++ ICE at -O1 and above on valid code on x86_64-linux-gnu in "copy_reference_ops_from_ref")

	PR c++/70144
	* cp-tree.h (magic_varargs_p): Return int instead of bool.
	* call.c (magic_varargs_p): Return int instead of bool, return 2 for
	Cilk+ reductions, otherwise 1 for magic varargs and 0 for normal
	varargs.
	(build_over_call): If magic_varargs_p == 2, call reject_gcc_builtin,
	if magic_varargs_p == 1, call decay_conversion
	instead of mark_type_use.  Don't store error_mark_node arguments to
	argarray, instead return error_mark_node.

	* c-c++-common/pr70144-1.c: New test.
	* c-c++-common/pr70144-2.c: New test.

From-SVN: r234297
parent a3aad0e6
2016-03-17 Jakub Jelinek <jakub@redhat.com> 2016-03-17 Jakub Jelinek <jakub@redhat.com>
PR c++/70144
* cp-tree.h (magic_varargs_p): Return int instead of bool.
* call.c (magic_varargs_p): Return int instead of bool, return 2 for
Cilk+ reductions, otherwise 1 for magic varargs and 0 for normal
varargs.
(build_over_call): If magic_varargs_p == 2, call reject_gcc_builtin,
if magic_varargs_p == 1, call decay_conversion
instead of mark_type_use. Don't store error_mark_node arguments to
argarray, instead return error_mark_node.
PR c++/70272 PR c++/70272
* decl.c (begin_destructor_body): Don't insert clobber if * decl.c (begin_destructor_body): Don't insert clobber if
is_empty_class (current_class_type). is_empty_class (current_class_type).
......
...@@ -7040,15 +7040,17 @@ convert_for_arg_passing (tree type, tree val, tsubst_flags_t complain) ...@@ -7040,15 +7040,17 @@ convert_for_arg_passing (tree type, tree val, tsubst_flags_t complain)
return val; return val;
} }
/* Returns true iff FN is a function with magic varargs, i.e. ones for /* Returns non-zero iff FN is a function with magic varargs, i.e. ones for
which no conversions at all should be done. This is true for some which just decay_conversion or no conversions at all should be done.
builtins which don't act like normal functions. */ This is true for some builtins which don't act like normal functions.
Return 2 if no conversions at all should be done, 1 if just
decay_conversion. */
bool int
magic_varargs_p (tree fn) magic_varargs_p (tree fn)
{ {
if (flag_cilkplus && is_cilkplus_reduce_builtin (fn) != BUILT_IN_NONE) if (flag_cilkplus && is_cilkplus_reduce_builtin (fn) != BUILT_IN_NONE)
return true; return 2;
if (DECL_BUILT_IN (fn)) if (DECL_BUILT_IN (fn))
switch (DECL_FUNCTION_CODE (fn)) switch (DECL_FUNCTION_CODE (fn))
...@@ -7057,14 +7059,14 @@ magic_varargs_p (tree fn) ...@@ -7057,14 +7059,14 @@ magic_varargs_p (tree fn)
case BUILT_IN_CONSTANT_P: case BUILT_IN_CONSTANT_P:
case BUILT_IN_NEXT_ARG: case BUILT_IN_NEXT_ARG:
case BUILT_IN_VA_START: case BUILT_IN_VA_START:
return true; return 1;
default:; default:;
return lookup_attribute ("type generic", return lookup_attribute ("type generic",
TYPE_ATTRIBUTES (TREE_TYPE (fn))) != 0; TYPE_ATTRIBUTES (TREE_TYPE (fn))) != 0;
} }
return false; return 0;
} }
/* Returns the decl of the dispatcher function if FN is a function version. */ /* Returns the decl of the dispatcher function if FN is a function version. */
...@@ -7515,9 +7517,17 @@ build_over_call (struct z_candidate *cand, int flags, tsubst_flags_t complain) ...@@ -7515,9 +7517,17 @@ build_over_call (struct z_candidate *cand, int flags, tsubst_flags_t complain)
for (; arg_index < vec_safe_length (args); ++arg_index) for (; arg_index < vec_safe_length (args); ++arg_index)
{ {
tree a = (*args)[arg_index]; tree a = (*args)[arg_index];
if (magic_varargs_p (fn)) int magic = magic_varargs_p (fn);
/* Do no conversions for magic varargs. */ if (magic == 2)
a = mark_type_use (a); {
/* Do no conversions for certain magic varargs. */
a = mark_type_use (a);
if (TREE_CODE (a) == FUNCTION_DECL && reject_gcc_builtin (a))
return error_mark_node;
}
else if (magic == 1)
/* For other magic varargs only do decay_conversion. */
a = decay_conversion (a, complain);
else if (DECL_CONSTRUCTOR_P (fn) else if (DECL_CONSTRUCTOR_P (fn)
&& same_type_ignoring_top_level_qualifiers_p (DECL_CONTEXT (fn), && same_type_ignoring_top_level_qualifiers_p (DECL_CONTEXT (fn),
TREE_TYPE (a))) TREE_TYPE (a)))
...@@ -7530,6 +7540,8 @@ build_over_call (struct z_candidate *cand, int flags, tsubst_flags_t complain) ...@@ -7530,6 +7540,8 @@ build_over_call (struct z_candidate *cand, int flags, tsubst_flags_t complain)
} }
else else
a = convert_arg_to_ellipsis (a, complain); a = convert_arg_to_ellipsis (a, complain);
if (a == error_mark_node)
return error_mark_node;
argarray[j++] = a; argarray[j++] = a;
} }
......
...@@ -5563,7 +5563,7 @@ public: ...@@ -5563,7 +5563,7 @@ public:
/* in call.c */ /* in call.c */
extern bool check_dtor_name (tree, tree); extern bool check_dtor_name (tree, tree);
bool magic_varargs_p (tree); int magic_varargs_p (tree);
extern tree build_conditional_expr (location_t, tree, tree, tree, extern tree build_conditional_expr (location_t, tree, tree, tree,
tsubst_flags_t); tsubst_flags_t);
......
2016-03-17 Jakub Jelinek <jakub@redhat.com> 2016-03-17 Jakub Jelinek <jakub@redhat.com>
PR c++/70144
* c-c++-common/pr70144-1.c: New test.
* c-c++-common/pr70144-2.c: New test.
PR c++/70272 PR c++/70272
* g++.dg/opt/flifetime-dse5.C (main): Remove extra semicolon. * g++.dg/opt/flifetime-dse5.C (main): Remove extra semicolon.
* g++.dg/opt/flifetime-dse6.C: New test. * g++.dg/opt/flifetime-dse6.C: New test.
......
/* PR c++/70144 */
/* { dg-do compile } */
void
foo ()
{
__builtin_constant_p (__builtin_constant_p) ?: ({ unsigned t = 0; t; }); /* { dg-error "must be directly called" } */
__builtin_classify_type (__builtin_expect); /* { dg-error "must be directly called" } */
}
/* PR c++/70144 */
/* { dg-do run } */
/* { dg-options "-O2" } */
int
main ()
{
if (__builtin_constant_p (__builtin_memset) != 0
|| __builtin_classify_type (__builtin_memset) != 5)
__builtin_abort ();
return 0;
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment