diff options
-rw-r--r-- | gcc/cp/init.c | 3 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/diagnostic/recur-align.C | 19 |
2 files changed, 21 insertions, 1 deletions
diff --git a/gcc/cp/init.c b/gcc/cp/init.c index 3f56ca4..9d616f3 100644 --- a/gcc/cp/init.c +++ b/gcc/cp/init.c @@ -3408,7 +3408,8 @@ build_new_1 (vec<tree, va_gc> **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 0000000..e7d4b9a --- /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<typename T> +auto Foo (const T* x) -> decltype (new T (*x)) +{ + return new T (*x); // { dg-warning "with extended alignment" } +} + +void Bar () { + Aligned y; + Foo (&y); +} |