[PATCH] PR c++/90243 - orphaned note in uninstantiated constexpr function

Jonathan Wakely jwakely@redhat.com
Thu Apr 25 21:02:00 GMT 2019


gcc/cp:

	PR c++/90243 - orphaned note in uninstantiated constexpr function
	* decl.c (check_for_uninitialized_const_var): Suppress notes if no
	error was shown.

gcc/testsuite:

	PR c++/90243
	* g++.dg/diagnostic/pr90243.C: New test.

Tested powerpc64le-linux, OK for trunk?


-------------- next part --------------
commit 5c7cb4d6d48be1d6c8609ba691b7b279b97c46c9
Author: Jonathan Wakely <jwakely@redhat.com>
Date:   Thu Apr 25 09:25:55 2019 +0100

    PR c++/90243 - orphaned note in uninstantiated constexpr function
    
    gcc/cp:
    
            PR c++/90243 - orphaned note in uninstantiated constexpr function
            * decl.c (check_for_uninitialized_const_var): Suppress notes if no
            error was shown.
    
    gcc/testsuite:
    
            PR c++/90243
            * g++.dg/diagnostic/pr90243.C: New test.

diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c
index 01c89cd572d..b91cdb6d26b 100644
--- a/gcc/cp/decl.c
+++ b/gcc/cp/decl.c
@@ -5691,13 +5691,15 @@ check_for_uninitialized_const_var (tree decl, bool constexpr_context_p,
       if (!field)
 	return true;
 
+      bool show_notes = true;
+
       if (!constexpr_context_p)
 	{
 	  if (CP_TYPE_CONST_P (type))
 	    {
 	      if (complain & tf_error)
-		permerror (DECL_SOURCE_LOCATION (decl),
-			   "uninitialized const %qD", decl);
+		show_notes = permerror (DECL_SOURCE_LOCATION (decl),
+				        "uninitialized const %qD", decl);
 	    }
 	  else
 	    {
@@ -5706,6 +5708,8 @@ check_for_uninitialized_const_var (tree decl, bool constexpr_context_p,
 		error_at (DECL_SOURCE_LOCATION (decl),
 			  "uninitialized variable %qD in %<constexpr%> "
 			  "function", decl);
+	      else
+		show_notes = false;
 	      cp_function_chain->invalid_constexpr = true;
 	    }
 	}
@@ -5714,7 +5718,7 @@ check_for_uninitialized_const_var (tree decl, bool constexpr_context_p,
 		  "uninitialized variable %qD in %<constexpr%> context",
 		  decl);
 
-      if (CLASS_TYPE_P (type) && (complain & tf_error))
+      if (show_notes && CLASS_TYPE_P (type) && (complain & tf_error))
 	{
 	  tree defaulted_ctor;
 
diff --git a/gcc/testsuite/g++.dg/diagnostic/pr90243.C b/gcc/testsuite/g++.dg/diagnostic/pr90243.C
new file mode 100644
index 00000000000..3f5d915affc
--- /dev/null
+++ b/gcc/testsuite/g++.dg/diagnostic/pr90243.C
@@ -0,0 +1,13 @@
+// { dg-do compile { target c++14 } }
+struct Z { // { dg-bogus "default constructor" }
+  int y;   // { dg-bogus "initialize" }
+};
+
+template <class T>
+constexpr Z f(const T *data) {
+  Z z;
+  __builtin_memcpy(&z, data, sizeof(z));
+  return z;
+}
+
+constexpr Z g(const char *data) { return f(data); }


More information about the Gcc-patches mailing list