[C++] Fix ensure_literal_type_for_constexpr_object locations

Message ID fcee781c-780e-fcaf-9a44-3163971835a6@oracle.com
State New
Headers show
Series
  • [C++] Fix ensure_literal_type_for_constexpr_object locations
Related show

Commit Message

Paolo Carlini Nov. 15, 2018, 1:39 p.m.
Hi,

this one should be straightforward. Tested x86_64-linux.

Thanks, Paolo.

/////////////////////////
/cp
2018-11-15  Paolo Carlini  <paolo.carlini@oracle.com>

	* constexpr.c (ensure_literal_type_for_constexpr_object): Use
	DECL_SOURCE_LOCATION in error_at calls.

/testsuite
2018-11-15  Paolo Carlini  <paolo.carlini@oracle.com>

	* g++.dg/cpp0x/constexpr-diag3.C: Check locations too.
	* g++.dg/cpp0x/constexpr-ice19.C: Likewise.
	* g++.dg/cpp0x/constexpr-nonlit2.C: Likewise.
	* g++.dg/cpp1z/constexpr-lambda15.C: Likewise.
	* g++.dg/ext/constexpr-vla5.C: Likewise.
	* g++.dg/gomp/pr85134.C: Likewise.

Comments

Marek Polacek Nov. 15, 2018, 2:34 p.m. | #1
On Thu, Nov 15, 2018 at 02:39:14PM +0100, Paolo Carlini wrote:
> Hi,

> 

> this one should be straightforward. Tested x86_64-linux.

> 

> Thanks, Paolo.

> 

> /////////////////////////

> 


> /cp

> 2018-11-15  Paolo Carlini  <paolo.carlini@oracle.com>

> 

> 	* constexpr.c (ensure_literal_type_for_constexpr_object): Use

> 	DECL_SOURCE_LOCATION in error_at calls.

> 

> /testsuite

> 2018-11-15  Paolo Carlini  <paolo.carlini@oracle.com>

> 

> 	* g++.dg/cpp0x/constexpr-diag3.C: Check locations too.

> 	* g++.dg/cpp0x/constexpr-ice19.C: Likewise.

> 	* g++.dg/cpp0x/constexpr-nonlit2.C: Likewise.

> 	* g++.dg/cpp1z/constexpr-lambda15.C: Likewise.

> 	* g++.dg/ext/constexpr-vla5.C: Likewise.

> 	* g++.dg/gomp/pr85134.C: Likewise.


> Index: cp/constexpr.c

> ===================================================================

> --- cp/constexpr.c	(revision 266174)

> +++ cp/constexpr.c	(working copy)

> @@ -98,8 +98,9 @@ ensure_literal_type_for_constexpr_object (tree dec

>  	  if (DECL_DECLARED_CONSTEXPR_P (decl))

>  	    {

>  	      auto_diagnostic_group d;

> -	      error ("the type %qT of %<constexpr%> variable %qD "

> -		     "is not literal", type, decl);

> +	      error_at (DECL_SOURCE_LOCATION (decl),

> +			"the type %qT of %<constexpr%> variable %qD "

> +			"is not literal", type, decl);

>  	      explain_non_literal_class (type);

>  	      decl = error_mark_node;

>  	    }

> @@ -108,8 +109,9 @@ ensure_literal_type_for_constexpr_object (tree dec

>  	      if (!is_instantiation_of_constexpr (current_function_decl))

>  		{

>  		  auto_diagnostic_group d;

> -		  error ("variable %qD of non-literal type %qT in %<constexpr%> "

> -			 "function", decl, type);

> +		  error_at (DECL_SOURCE_LOCATION (decl),

> +			    "variable %qD of non-literal type %qT in "

> +			    "%<constexpr%> function", decl, type);

>  		  explain_non_literal_class (type);

>  		  decl = error_mark_node;

>  		}

> @@ -119,8 +121,9 @@ ensure_literal_type_for_constexpr_object (tree dec

>        else if (DECL_DECLARED_CONSTEXPR_P (decl)

>  	       && variably_modified_type_p (type, NULL_TREE))

>  	{

> -	  error ("%<constexpr%> variable %qD has variably-modified type %qT",

> -		 decl, type);

> +	  error_at (DECL_SOURCE_LOCATION (decl),

> +		    "%<constexpr%> variable %qD has variably-modified "

> +		    "type %qT", decl, type);

>  	  decl = error_mark_node;


How about using location_of instead of DECL_SOURCE_LOCATION?

Marek
Paolo Carlini Nov. 15, 2018, 2:39 p.m. | #2
Hi,

On 15/11/18 15:34, Marek Polacek wrote:
> How about using location_of instead of DECL_SOURCE_LOCATION? 


Well, we know that VAR_P is true of that DECL tree node, thus I don't 
see how location_of would be better. Certainly is more complex.

Paolo.
Jason Merrill Nov. 15, 2018, 4:52 p.m. | #3
OK.
On Thu, Nov 15, 2018 at 8:39 AM Paolo Carlini <paolo.carlini@oracle.com> wrote:
>

> Hi,

>

> this one should be straightforward. Tested x86_64-linux.

>

> Thanks, Paolo.

>

> /////////////////////////

>

Patch

Index: cp/constexpr.c
===================================================================
--- cp/constexpr.c	(revision 266174)
+++ cp/constexpr.c	(working copy)
@@ -98,8 +98,9 @@  ensure_literal_type_for_constexpr_object (tree dec
 	  if (DECL_DECLARED_CONSTEXPR_P (decl))
 	    {
 	      auto_diagnostic_group d;
-	      error ("the type %qT of %<constexpr%> variable %qD "
-		     "is not literal", type, decl);
+	      error_at (DECL_SOURCE_LOCATION (decl),
+			"the type %qT of %<constexpr%> variable %qD "
+			"is not literal", type, decl);
 	      explain_non_literal_class (type);
 	      decl = error_mark_node;
 	    }
@@ -108,8 +109,9 @@  ensure_literal_type_for_constexpr_object (tree dec
 	      if (!is_instantiation_of_constexpr (current_function_decl))
 		{
 		  auto_diagnostic_group d;
-		  error ("variable %qD of non-literal type %qT in %<constexpr%> "
-			 "function", decl, type);
+		  error_at (DECL_SOURCE_LOCATION (decl),
+			    "variable %qD of non-literal type %qT in "
+			    "%<constexpr%> function", decl, type);
 		  explain_non_literal_class (type);
 		  decl = error_mark_node;
 		}
@@ -119,8 +121,9 @@  ensure_literal_type_for_constexpr_object (tree dec
       else if (DECL_DECLARED_CONSTEXPR_P (decl)
 	       && variably_modified_type_p (type, NULL_TREE))
 	{
-	  error ("%<constexpr%> variable %qD has variably-modified type %qT",
-		 decl, type);
+	  error_at (DECL_SOURCE_LOCATION (decl),
+		    "%<constexpr%> variable %qD has variably-modified "
+		    "type %qT", decl, type);
 	  decl = error_mark_node;
 	}
     }
Index: testsuite/g++.dg/cpp0x/constexpr-diag3.C
===================================================================
--- testsuite/g++.dg/cpp0x/constexpr-diag3.C	(revision 266174)
+++ testsuite/g++.dg/cpp0x/constexpr-diag3.C	(working copy)
@@ -24,7 +24,7 @@  struct complex 			// { dg-message "no .constexpr.
   double im;
 };
 
-constexpr complex co1(0, 1);	   // { dg-error "not literal" }
+constexpr complex co1(0, 1);	   // { dg-error "19:the type .const complex. of .constexpr. variable .co1. is not literal" }
 constexpr double dd2 = co1.real(); // { dg-error "|in .constexpr. expansion of " }
 
 // --------------------
Index: testsuite/g++.dg/cpp0x/constexpr-ice19.C
===================================================================
--- testsuite/g++.dg/cpp0x/constexpr-ice19.C	(revision 266174)
+++ testsuite/g++.dg/cpp0x/constexpr-ice19.C	(working copy)
@@ -9,5 +9,6 @@  struct A
 
 struct B
 {
-  static constexpr A a {};  // { dg-error "not literal|in-class initialization" }
+  static constexpr A a {};  // { dg-error "22:the type .const A. of .constexpr. variable .B::a. is not literal" }
+// { dg-error "in-class initialization" "" { target c++11 } .-1 }
 };
Index: testsuite/g++.dg/cpp0x/constexpr-nonlit2.C
===================================================================
--- testsuite/g++.dg/cpp0x/constexpr-nonlit2.C	(revision 266174)
+++ testsuite/g++.dg/cpp0x/constexpr-nonlit2.C	(working copy)
@@ -16,4 +16,4 @@  template <class T>
 constexpr W<T> make_w(T& w) { return W<T>(w); }
 
 A a;
-constexpr auto w = make_w(a);	// { dg-error "" }
+constexpr auto w = make_w(a);	// { dg-error "16:the type .const W<A>. of .constexpr. variable .w. is not literal" }
Index: testsuite/g++.dg/cpp1z/constexpr-lambda15.C
===================================================================
--- testsuite/g++.dg/cpp1z/constexpr-lambda15.C	(revision 266174)
+++ testsuite/g++.dg/cpp1z/constexpr-lambda15.C	(working copy)
@@ -3,7 +3,7 @@ 
 
 struct S {
   constexpr S(int i) {
-    auto f = [i]{};		// { dg-error "literal" "" { target c++14_only } }
+    auto f = [i]{};		// { dg-error "10:variable .f. of non-literal type" "" { target c++14_only } }
   }
 };
 int main() {}
Index: testsuite/g++.dg/ext/constexpr-vla5.C
===================================================================
--- testsuite/g++.dg/ext/constexpr-vla5.C	(revision 266174)
+++ testsuite/g++.dg/ext/constexpr-vla5.C	(working copy)
@@ -3,5 +3,6 @@ 
 
 void foo(int i)
 {
-  constexpr char x[i] = "";	// { dg-error "" }
+  constexpr char x[i] = "";	// { dg-error "18:.constexpr. variable .x. has variably-modified type" }
+// { dg-error "ISO C\\+\\+ forbids variable length array .x" "" { target c++11 } .-1 }  
 }
Index: testsuite/g++.dg/gomp/pr85134.C
===================================================================
--- testsuite/g++.dg/gomp/pr85134.C	(revision 266174)
+++ testsuite/g++.dg/gomp/pr85134.C	(working copy)
@@ -5,7 +5,7 @@ 
 void
 foo (int i)
 {
-  constexpr int x[i] = {};	// { dg-error "'constexpr' variable 'x' has variably-modified type" }
+  constexpr int x[i] = {};	// { dg-error "17:'constexpr' variable 'x' has variably-modified type" }
 #pragma omp parallel shared(x)
   ;
 }