From f2da9e26f5c0f04d48872938eff130e2028e75d3 Mon Sep 17 00:00:00 2001 From: Nathan Sidwell Date: Tue, 4 Jan 2022 12:45:36 -0800 Subject: [PATCH] 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. --- gcc/cp/init.c | 3 ++- gcc/testsuite/g++.dg/diagnostic/recur-align.C | 19 +++++++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/g++.dg/diagnostic/recur-align.C 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); +} -- 2.47.2