This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH] PR c++/80473 allow suppressing notes about over-aligned new


On 20/04/17 17:43 +0100, Jonathan Wakely wrote:
On 20/04/17 17:33 +0200, Marek Polacek wrote:
On Thu, Apr 20, 2017 at 05:22:00PM +0200, Jakub Jelinek wrote:
On Thu, Apr 20, 2017 at 04:09:20PM +0100, Jonathan Wakely wrote:
--- a/gcc/cp/init.c
+++ b/gcc/cp/init.c
@@ -3128,11 +3128,14 @@ build_new_1 (vec<tree, va_gc> **placement, tree type, tree nelts,
     {
       warning (OPT_Waligned_new_, "%<new%> of type %qT with extended "
 	       "alignment %d", elt_type, TYPE_ALIGN_UNIT (elt_type));
-      inform (input_location, "uses %qD, which does not have an alignment "
-	      "parameter", alloc_fn);
-      if (!aligned_new_threshold)
-	inform (input_location, "use %<-faligned-new%> to enable C++17 "
-				"over-aligned new support");
+      if (diagnostic_report_warnings_p (global_dc, input_location))
+	{
+	  inform (input_location, "uses %qD, which does not have an alignment "
+		  "parameter", alloc_fn);
+	  if (!aligned_new_threshold)
+	    inform (input_location, "use %<-faligned-new%> to enable C++17 "
+				    "over-aligned new support");
+	}

This looks weird.  I'd expect instead:
     if (warning (OPT_Waligned_new_, "%<new%> of type %qT with extended "
		   "alignment %d", elt_type, TYPE_ALIGN_UNIT (elt_type)))
	{
	  inform (input_location, "uses %qD, which does not have an alignment "
		  "parameter", alloc_fn);
	  if (!aligned_new_threshold)
	    inform (input_location, "use %<-faligned-new%> to enable C++17 "
				    "over-aligned new support");
	}
That is a standard idiom used if some inform or later warning/error depends
on whether earlier warning/error has been diagnosed.

Yes.

If that works, this is ok for trunk and 7.1 (we don't have a rc1 yet, it is
ok now).

One more thing, the test passes even without the patch.  Did you mean to add
// { dg-options "-Wall -w" }
?

Good catch. My original testcase used <type_traits> but I changed it
to not depend on the library, and didn't fix the dg-options.

Here's what I'm going to commit. Thanks for the reviews/help :)



commit 8a5d42bf7baba903807617e6dd800582514dec0b
Author: Jonathan Wakely <jwakely@redhat.com>
Date:   Thu Apr 20 15:24:09 2017 +0100

    PR c++/80473 allow suppressing notes about over-aligned new
    
    gcc/cp:
    
    	PR c++/80473
    	* init.c (build_new_1): Suppress notes about over-aligned new when
    	the warning is suppressed.
    
    gcc/testsuite:
    
    	PR c++/80473
    	* g++.dg/diagnostic/pr80473.C: New test.

diff --git a/gcc/cp/init.c b/gcc/cp/init.c
index bfa9020..e9c39ff 100644
--- a/gcc/cp/init.c
+++ b/gcc/cp/init.c
@@ -3126,13 +3126,15 @@ build_new_1 (vec<tree, va_gc> **placement, tree type, tree nelts,
 	  || CP_DECL_CONTEXT (alloc_fn) == global_namespace)
       && !aligned_allocation_fn_p (alloc_fn))
     {
-      warning (OPT_Waligned_new_, "%<new%> of type %qT with extended "
-	       "alignment %d", elt_type, TYPE_ALIGN_UNIT (elt_type));
-      inform (input_location, "uses %qD, which does not have an alignment "
-	      "parameter", alloc_fn);
-      if (!aligned_new_threshold)
-	inform (input_location, "use %<-faligned-new%> to enable C++17 "
-				"over-aligned new support");
+      if (warning (OPT_Waligned_new_, "%<new%> of type %qT with extended "
+		   "alignment %d", elt_type, TYPE_ALIGN_UNIT (elt_type)))
+	{
+	  inform (input_location, "uses %qD, which does not have an alignment "
+		  "parameter", alloc_fn);
+	  if (!aligned_new_threshold)
+	    inform (input_location, "use %<-faligned-new%> to enable C++17 "
+				    "over-aligned new support");
+	}
     }
 
   /* If we found a simple case of PLACEMENT_EXPR above, then copy it
diff --git a/gcc/testsuite/g++.dg/diagnostic/pr80473.C b/gcc/testsuite/g++.dg/diagnostic/pr80473.C
new file mode 100644
index 0000000..8721213
--- /dev/null
+++ b/gcc/testsuite/g++.dg/diagnostic/pr80473.C
@@ -0,0 +1,16 @@
+// { dg-options "-Wall -w" }
+// { dg-do compile { target c++11 } }
+// { dg-bogus "over-aligned new" "PR c++/80473" { target *-*-* } 0 }
+
+template<typename T> T&& declval();
+
+template<typename T, typename U, typename = void>
+struct is_constructible { enum { value = 0 }; };
+
+template<typename T, typename U>
+struct is_constructible<T, U, decltype(::new T(declval<U>()), void())>
+{ enum { value = 1 }; };
+
+struct alignas(64) A { int i; };
+
+constexpr bool b = is_constructible<A, A>::value;

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]