From: Nathan Sidwell Date: Tue, 4 Jan 2022 20:45:36 +0000 (-0800) Subject: Fix diagnostic recursion ICE X-Git-Tag: basepoints/gcc-13~2059 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=f2da9e26f5c0f04d48872938eff130e2028e75d3;p=thirdparty%2Fgcc.git Fix diagnostic recursion ICE The [with T = $TYPE] diagnostic machinery must not cause recursion. So let's not unilaterally warn about new alignment. (template extracted from Open3D.) gcc/cp/ * init.c (build_new_1): Check complain before alignment warning. gcc/testsuite/ * g++.dg/diagnostic/recur-align.C: New. --- diff --git a/gcc/cp/init.c b/gcc/cp/init.c index 3f56ca4bf5ef..9d616f3f5e96 100644 --- a/gcc/cp/init.c +++ b/gcc/cp/init.c @@ -3408,7 +3408,8 @@ build_new_1 (vec **placement, tree type, tree nelts, = (type_num_arguments (TREE_TYPE (alloc_fn)) > 1 || varargs_function_p (alloc_fn)); - if (warn_aligned_new + if (complain & tf_warning_or_error + && warn_aligned_new && !placement_allocation_fn_p && TYPE_ALIGN (elt_type) > malloc_alignment () && (warn_aligned_new > 1 diff --git a/gcc/testsuite/g++.dg/diagnostic/recur-align.C b/gcc/testsuite/g++.dg/diagnostic/recur-align.C new file mode 100644 index 000000000000..e7d4b9a17cca --- /dev/null +++ b/gcc/testsuite/g++.dg/diagnostic/recur-align.C @@ -0,0 +1,19 @@ +// ICE with diagnostic recursion +// { dg-do compile { target { c++11_only || c++14_only } } } +// { dg-options -Waligned-new } + +struct __attribute__ ((aligned(256))) Aligned +{ + int b; +}; + +template +auto Foo (const T* x) -> decltype (new T (*x)) +{ + return new T (*x); // { dg-warning "with extended alignment" } +} + +void Bar () { + Aligned y; + Foo (&y); +}