Re: C++ PATCH for c++/70353 (core issue 1962)

2016-03-28 Thread Dominique d'Humières

> Le 28 mars 2016 à 15:11, Jason Merrill  a écrit :
> 
> On 03/28/2016 09:02 AM, Dominique d'Humières wrote:
>> 
>>> Le 28 mars 2016 à 14:55, Jason Merrill  a écrit :
>>> 
>>> OK, thanks.
>>> 
>>> Jason
>> 
>> Does it mean that I should commit the patch?
> 
> Please.

Revision 234504.

Dominique

> Jason
> 



Re: C++ PATCH for c++/70353 (core issue 1962)

2016-03-28 Thread Jason Merrill

On 03/28/2016 09:02 AM, Dominique d'Humières wrote:



Le 28 mars 2016 à 14:55, Jason Merrill  a écrit :

OK, thanks.

Jason


Does it mean that I should commit the patch?


Please.

Jason




Re: C++ PATCH for c++/70353 (core issue 1962)

2016-03-28 Thread Dominique d'Humières

> Le 28 mars 2016 à 14:55, Jason Merrill  a écrit :
> 
> OK, thanks.
> 
> Jason

Does it mean that I should commit the patch?

Dominique



Re: C++ PATCH for c++/70353 (core issue 1962)

2016-03-28 Thread Jason Merrill

OK, thanks.

Jason


Re: C++ PATCH for c++/70353 (core issue 1962)

2016-03-27 Thread Segher Boessenkool
On Fri, Mar 25, 2016 at 05:29:26PM -0400, Jason Merrill wrote:
> 70353 is a problem with the function-local static declaration of 
> __func__.  Normally constexpr functions can't have local statics, so 
> this is only an issue with __func__.  Meanwhile, core issue 1962 looks 
> like it's going to be resolved by changing __func__ et al to be prvalue 
> constants of type const char * rather than static local array variables, 
> so implementing that proposed resolution also resolves this issue, as 
> well as 62466 which complains about the strings not being merged between 
> translation units.  This patch proceeds from Martin's work last year.
> 
> Tested x86_64-pc-linux-gnu, applying to trunk.

This patch caused PR70422, a bootstrap comparison failure on aarch64,
ia64, and powerpc64.


Segher


Re: C++ PATCH for c++/70353 (core issue 1962)

2016-03-26 Thread Markus Trippelsdorf
On 2016.03.25 at 17:29 -0400, Jason Merrill wrote:
> 70353 is a problem with the function-local static declaration of __func__.
> Normally constexpr functions can't have local statics, so this is only an
> issue with __func__.  Meanwhile, core issue 1962 looks like it's going to be
> resolved by changing __func__ et al to be prvalue constants of type const
> char * rather than static local array variables, so implementing that
> proposed resolution also resolves this issue, as well as 62466 which
> complains about the strings not being merged between translation units.
> This patch proceeds from Martin's work last year.
> 
> Tested x86_64-pc-linux-gnu, applying to trunk.

It breaks building Firefox:

trippels@gcc2-power8 places % cat nsNavHistory.ii
struct A {
  template  A(const char (&)[N]);
};
void fn1() { A(__func__); }


trippels@gcc2-power8 places % c++  -c nsNavHistory.ii
nsNavHistory.ii: In function ‘void fn1()’:
nsNavHistory.ii:4:24: error: no matching function for call to ‘A::A(const 
char*&)’
 void fn1() { A(__func__); }
^
nsNavHistory.ii:2:20: note: candidate: template A::A(const char (&)[N])
   template  A(const char (&)[N]);
^
nsNavHistory.ii:2:20: note:   template argument deduction/substitution failed:
nsNavHistory.ii:4:24: note:   mismatched types ‘const char [N]’ and ‘const 
char*’
 void fn1() { A(__func__); }
^
nsNavHistory.ii:1:8: note: candidate: constexpr A::A(const A&)
 struct A {
^
nsNavHistory.ii:1:8: note:   no known conversion for argument 1 from ‘const 
char*’ to ‘const A&’
nsNavHistory.ii:1:8: note: candidate: constexpr A::A(A&&)
nsNavHistory.ii:1:8: note:   no known conversion for argument 1 from ‘const 
char*’ to ‘A&&’

So I'm not sure if your patch is really appropriate at this time.
Maybe waiting until next stage 1 would be better?

-- 
Markus


Re: C++ PATCH for c++/70353 (core issue 1962)

2016-03-26 Thread Dominique d'Humières
Hi Jason,

The following tests for g++.dg/ext/fnname5.C fail on darwin

FAIL: g++.dg/ext/fnname5.C  -std=c++11  scan-assembler .string\\t"foo"
FAIL: g++.dg/ext/fnname5.C  -std=c++11  scan-assembler .string\\t"void 
A::foo(int)"
FAIL: g++.dg/ext/fnname5.C  -std=c++14  scan-assembler .string\\t"foo"
FAIL: g++.dg/ext/fnname5.C  -std=c++14  scan-assembler .string\\t"void 
A::foo(int)"
FAIL: g++.dg/ext/fnname5.C  -std=c++98  scan-assembler .string\\t"foo"
FAIL: g++.dg/ext/fnname5.C  -std=c++98  scan-assembler .string\\t"void 
A::foo(int) »

AFAICT the corresponding patterns are

.ascii "foo\0"
.ascii "void A::foo(int)\0 »

This is fixed by the following patch

--- ../_clean/gcc/testsuite/g++.dg/ext/fnname5.C2016-03-25 
22:46:32.0 +0100
+++ gcc/testsuite/g++.dg/ext/fnname5.C  2016-03-26 09:04:51.0 +0100
@@ -29,5 +29,5 @@ main ()
 /* { dg-final { scan-assembler-not "_ZZN1A3fooEvE12__FUNCTION__" } } */
 /* { dg-final { scan-assembler-not "_ZZN1A3fooEiE12__FUNCTION__" } } */
 /* { dg-final { scan-assembler-not "_ZZN1A3fooEiE19__PRETTY_FUNCTION__" } } */
-/* { dg-final { scan-assembler ".string\"void A::foo\\(int\\)\"" } } */
-/* { dg-final { scan-assembler ".string\"foo\"" } } */
+/* { dg-final { scan-assembler ".(string|ascii) \"void A::foo\\(int\\)(.0)?\"" 
} } */
+/* { dg-final { scan-assembler ".(string|ascii) \"foo(.0)?\"" } } */

TIA

Dominique







C++ PATCH for c++/70353 (core issue 1962)

2016-03-25 Thread Jason Merrill
70353 is a problem with the function-local static declaration of 
__func__.  Normally constexpr functions can't have local statics, so 
this is only an issue with __func__.  Meanwhile, core issue 1962 looks 
like it's going to be resolved by changing __func__ et al to be prvalue 
constants of type const char * rather than static local array variables, 
so implementing that proposed resolution also resolves this issue, as 
well as 62466 which complains about the strings not being merged between 
translation units.  This patch proceeds from Martin's work last year.


Tested x86_64-pc-linux-gnu, applying to trunk.


commit 4b69c2588521dc0d65e1fd7308ff322ffb35e5b0
Author: Jason Merrill 
Date:   Fri Mar 25 16:19:20 2016 -0400

	PR c++/64266
	PR c++/70353
	Core issue 1962
	* decl.c (cp_fname_init): Decay the initializer to pointer.
	(cp_make_fname_decl): Set DECL_DECLARED_CONSTEXPR_P,
	DECL_VALUE_EXPR, DECL_INITIALIZED_BY_CONSTANT_EXPRESSION_P.
	Don't call cp_finish_decl.
	* pt.c (tsubst_expr) [DECL_EXPR]: Set DECL_VALUE_EXPR,
	DECL_INITIALIZED_BY_CONSTANT_EXPRESSION_P.  Don't call cp_finish_decl.
	* constexpr.c (cxx_eval_constant_expression) [VAR_DECL]:
	Handle DECL_VALUE_EXPR.

diff --git a/gcc/cp/constexpr.c b/gcc/cp/constexpr.c
index 8ea7111..7776cac 100644
--- a/gcc/cp/constexpr.c
+++ b/gcc/cp/constexpr.c
@@ -3363,6 +3363,10 @@ cxx_eval_constant_expression (const constexpr_ctx *ctx, tree t,
   return (*ctx->values->get (t));
 
 case VAR_DECL:
+  if (DECL_HAS_VALUE_EXPR_P (t))
+	return cxx_eval_constant_expression (ctx, DECL_VALUE_EXPR (t), lval,
+	 non_constant_p, overflow_p);
+  /* Fall through.  */
 case CONST_DECL:
   /* We used to not check lval for CONST_DECL, but darwin.c uses
 	 CONST_DECL for aggregate constants.  */
diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c
index cd5db3f..a88b642 100644
--- a/gcc/cp/decl.c
+++ b/gcc/cp/decl.c
@@ -4185,13 +4185,15 @@ cp_fname_init (const char* name, tree *type_p)
   type = cp_build_qualified_type (char_type_node, TYPE_QUAL_CONST);
   type = build_cplus_array_type (type, domain);
 
-  *type_p = type;
+  *type_p = type_decays_to (type);
 
   if (init)
 TREE_TYPE (init) = type;
   else
 init = error_mark_node;
 
+  init = decay_conversion (init, tf_warning_or_error);
+
   return init;
 }
 
@@ -4217,12 +4219,20 @@ cp_make_fname_decl (location_t loc, tree id, int type_dep)
   /* As we're using pushdecl_with_scope, we must set the context.  */
   DECL_CONTEXT (decl) = current_function_decl;
 
-  TREE_STATIC (decl) = 1;
   TREE_READONLY (decl) = 1;
   DECL_ARTIFICIAL (decl) = 1;
+  DECL_DECLARED_CONSTEXPR_P (decl) = 1;
 
   TREE_USED (decl) = 1;
 
+  if (init)
+{
+  SET_DECL_VALUE_EXPR (decl, init);
+  DECL_HAS_VALUE_EXPR_P (decl) = 1;
+  /* For decl_constant_var_p.  */
+  DECL_INITIALIZED_BY_CONSTANT_EXPRESSION_P (decl) = 1;
+}
+
   if (current_function_decl)
 {
   cp_binding_level *b = current_binding_level;
@@ -4231,13 +4241,12 @@ cp_make_fname_decl (location_t loc, tree id, int type_dep)
   while (b->level_chain->kind != sk_function_parms)
 	b = b->level_chain;
   pushdecl_with_scope (decl, b, /*is_friend=*/false);
-  cp_finish_decl (decl, init, /*init_const_expr_p=*/false, NULL_TREE,
-		  LOOKUP_ONLYCONVERTING);
+  add_decl_expr (decl);
 }
   else
 {
   DECL_THIS_STATIC (decl) = true;
-  pushdecl_top_level_and_finish (decl, init);
+  pushdecl_top_level_and_finish (decl, NULL_TREE);
 }
 
   return decl;
diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c
index a6398c0..e0b7a2a 100644
--- a/gcc/cp/pt.c
+++ b/gcc/cp/pt.c
@@ -15194,21 +15194,25 @@ tsubst_expr (tree t, tree args, tsubst_flags_t complain, tree in_decl,
 		DECL_CONTEXT (decl) = current_function_decl;
 		cp_check_omp_declare_reduction (decl);
 		  }
+		else if (VAR_P (decl)
+			 && DECL_PRETTY_FUNCTION_P (decl))
+		  {
+		/* For __PRETTY_FUNCTION__ we have to adjust the
+		   initializer.  */
+		const char *const name
+		  = cxx_printable_name (current_function_decl, 2);
+		init = cp_fname_init (name, &TREE_TYPE (decl));
+		SET_DECL_VALUE_EXPR (decl, init);
+		DECL_HAS_VALUE_EXPR_P (decl) = 1;
+		DECL_INITIALIZED_BY_CONSTANT_EXPRESSION_P (decl) = 1;
+		maybe_push_decl (decl);
+		  }
 		else
 		  {
 		int const_init = false;
 		maybe_push_decl (decl);
-		if (VAR_P (decl)
-			&& DECL_PRETTY_FUNCTION_P (decl))
-		  {
-			/* For __PRETTY_FUNCTION__ we have to adjust the
-			   initializer.  */
-			const char *const name
-			  = cxx_printable_name (current_function_decl, 2);
-			init = cp_fname_init (name, &TREE_TYPE (decl));
-		  }
-		else
-		  init = tsubst_init (init, decl, args, complain, in_decl);
+
+		init = tsubst_init (init, decl, args, complain, in_decl);
 
 		if (VAR_P (decl))
 		  const_init = (DECL_INITIALIZED_BY_CONSTANT_EXPRESSION_P
diff --git a/gcc/testsuite/g++.dg/cpp0x/