Re: [PATCH] c++: Fix access checking for __is_assignable and __is_constructible (c++/94197)

2020-03-17 Thread Jason Merrill via Gcc-patches

On 3/17/20 11:25 AM, Ville Voutilainen wrote:

On Tue, 17 Mar 2020 at 16:52, Ville Voutilainen
 wrote:


On Tue, 17 Mar 2020 at 16:42, Jason Merrill  wrote:


On 3/17/20 9:04 AM, Jonathan Wakely wrote:

On 17/03/20 13:02 +, Jonathan Wakely wrote:

Shouldn't the test use { dg-do compile { target c++11 } } instead of:

+// { dg-do compile }
+// { dg-options "-std=c++11" }


Yes, good point.


Ack, changing to { dg-do compile { target c++11 } } and committing
with the (correct :P) expectation that
the change is still ok with that change.


Jason, are backports ok too?


Yes.

Jason



Re: [PATCH] c++: Fix access checking for __is_assignable and __is_constructible (c++/94197)

2020-03-17 Thread Ville Voutilainen via Gcc-patches
On Tue, 17 Mar 2020 at 16:52, Ville Voutilainen
 wrote:
>
> On Tue, 17 Mar 2020 at 16:42, Jason Merrill  wrote:
> >
> > On 3/17/20 9:04 AM, Jonathan Wakely wrote:
> > > On 17/03/20 13:02 +, Jonathan Wakely wrote:
> > >> Shouldn't the test use { dg-do compile { target c++11 } } instead of:
> > >>
> > >> +// { dg-do compile }
> > >> +// { dg-options "-std=c++11" }
> >
> > Yes, good point.
>
> Ack, changing to { dg-do compile { target c++11 } } and committing
> with the (correct :P) expectation that
> the change is still ok with that change.

Jason, are backports ok too?


Re: [PATCH] c++: Fix access checking for __is_assignable and __is_constructible (c++/94197)

2020-03-17 Thread Ville Voutilainen via Gcc-patches
On Tue, 17 Mar 2020 at 16:42, Jason Merrill  wrote:
>
> On 3/17/20 9:04 AM, Jonathan Wakely wrote:
> > On 17/03/20 13:02 +, Jonathan Wakely wrote:
> >> Shouldn't the test use { dg-do compile { target c++11 } } instead of:
> >>
> >> +// { dg-do compile }
> >> +// { dg-options "-std=c++11" }
>
> Yes, good point.

Ack, changing to { dg-do compile { target c++11 } } and committing
with the (correct :P) expectation that
the change is still ok with that change.


Re: [PATCH] c++: Fix access checking for __is_assignable and __is_constructible (c++/94197)

2020-03-17 Thread Jason Merrill via Gcc-patches

On 3/17/20 9:04 AM, Jonathan Wakely wrote:

On 17/03/20 13:02 +, Jonathan Wakely wrote:

Shouldn't the test use { dg-do compile { target c++11 } } instead of:

+// { dg-do compile }
+// { dg-options "-std=c++11" }

?



With that change I see:

UNSUPPORTED: g++.dg/ext/pr94197.C  -std=c++98
PASS: g++.dg/ext/pr94197.C  -std=c++14 (test for excess errors)
PASS: g++.dg/ext/pr94197.C  -std=c++17 (test for excess errors)
PASS: g++.dg/ext/pr94197.C  -std=c++2a (test for excess errors)

rather than:

PASS: g++.dg/ext/pr94197.C   (test for excess errors)


Yes, good point.

Jason




Re: [PATCH] c++: Fix access checking for __is_assignable and __is_constructible (c++/94197)

2020-03-17 Thread Jonathan Wakely via Gcc-patches

On 17/03/20 13:02 +, Jonathan Wakely wrote:

Shouldn't the test use { dg-do compile { target c++11 } } instead of:

+// { dg-do compile }
+// { dg-options "-std=c++11" }

?



With that change I see:

UNSUPPORTED: g++.dg/ext/pr94197.C  -std=c++98
PASS: g++.dg/ext/pr94197.C  -std=c++14 (test for excess errors)
PASS: g++.dg/ext/pr94197.C  -std=c++17 (test for excess errors)
PASS: g++.dg/ext/pr94197.C  -std=c++2a (test for excess errors)

rather than:

PASS: g++.dg/ext/pr94197.C   (test for excess errors)




Re: [PATCH] c++: Fix access checking for __is_assignable and __is_constructible (c++/94197)

2020-03-17 Thread Jonathan Wakely via Gcc-patches
Shouldn't the test use { dg-do compile { target c++11 } } instead of:

+// { dg-do compile }
+// { dg-options "-std=c++11" }

?



Re: [PATCH] c++: Fix access checking for __is_assignable and __is_constructible (c++/94197)

2020-03-16 Thread Jason Merrill via Gcc-patches

On 3/16/20 6:13 PM, Ville Voutilainen wrote:

On Mon, 16 Mar 2020 at 23:25, Ville Voutilainen
 wrote:


Tested on Linux-PPC64.

This ain't no regression. But it seems to hamper attempts to fix library
regressions (see https://gcc.gnu.org/bugzilla/show_bug.cgi?id=94033).


It occurred to me that this can be done in one place.

2020-03-17  Ville Voutilainen  

 gcc/

 PR c++/94197
 * cp/method.c (assignable_expr): Use cp_unevaluated.
 (is_xible_helper): Push a non-deferred access check for
 the stub objects created by assignable_expr and constructible_expr.


It occurs to me that we don't need to defer access control in 
instantiate_template_1 if we're instantiating an alias template, but 
this patch is OK as is.


Jason



Re: [PATCH] c++: Fix access checking for __is_assignable and __is_constructible (c++/94197)

2020-03-16 Thread Ville Voutilainen via Gcc-patches
On Mon, 16 Mar 2020 at 23:25, Ville Voutilainen
 wrote:
>
> Tested on Linux-PPC64.
>
> This ain't no regression. But it seems to hamper attempts to fix library
> regressions (see https://gcc.gnu.org/bugzilla/show_bug.cgi?id=94033).

It occurred to me that this can be done in one place.

2020-03-17  Ville Voutilainen  

gcc/

PR c++/94197
* cp/method.c (assignable_expr): Use cp_unevaluated.
(is_xible_helper): Push a non-deferred access check for
the stub objects created by assignable_expr and constructible_expr.

testsuite/

PR c++/94197
* g++.dg/ext/pr94197.C: New.
diff --git a/gcc/cp/method.c b/gcc/cp/method.c
index 790d5704092..3427750f64e 100644
--- a/gcc/cp/method.c
+++ b/gcc/cp/method.c
@@ -1739,11 +1739,10 @@ check_nontriv (tree *tp, int *, void *)
 static tree
 assignable_expr (tree to, tree from)
 {
-  ++cp_unevaluated_operand;
+  cp_unevaluated cp_uneval_guard;
   to = build_stub_object (to);
   from = build_stub_object (from);
   tree r = cp_build_modify_expr (input_location, to, NOP_EXPR, from, tf_none);
-  --cp_unevaluated_operand;
   return r;
 }
 
@@ -1806,6 +1805,7 @@ constructible_expr (tree to, tree from)
 static tree
 is_xible_helper (enum tree_code code, tree to, tree from, bool trivial)
 {
+  deferring_access_check_sentinel acs (dk_no_deferred);
   if (VOID_TYPE_P (to) || ABSTRACT_CLASS_TYPE_P (to)
   || (from && FUNC_OR_METHOD_TYPE_P (from)
 	  && (TYPE_READONLY (from) || FUNCTION_REF_QUALIFIED (from
diff --git a/gcc/testsuite/g++.dg/ext/pr94197.C b/gcc/testsuite/g++.dg/ext/pr94197.C
new file mode 100644
index 000..768bfbac0a6
--- /dev/null
+++ b/gcc/testsuite/g++.dg/ext/pr94197.C
@@ -0,0 +1,75 @@
+// { dg-do compile }
+// { dg-options "-std=c++11" }
+
+template
+  T&& declval() noexcept;
+
+template
+struct bool_constant
+{
+  static constexpr bool value = B;
+  using type = bool_constant;
+};
+
+using true_type = bool_constant;
+using false_type = bool_constant;
+
+template
+  struct __is_nt_constructible_impl
+  : public false_type
+  { };
+
+template
+  struct __is_nt_constructible_impl
+  : public bool_constant(declval()))>
+  { };
+
+template
+  using __is_nothrow_constructible_impl
+= __is_nt_constructible_impl<__is_constructible(T, Arg), T, Arg>;
+
+template
+  struct __is_nothrow_copy_constructible_impl
+  : public __is_nothrow_constructible_impl
+  { };
+
+template
+  struct is_nothrow_copy_constructible
+  : public __is_nothrow_copy_constructible_impl::type
+  { };
+
+template
+  struct __is_nt_assignable_impl
+  : public false_type
+  { };
+
+template
+  struct __is_nt_assignable_impl
+  : public bool_constant() = declval())>
+  { };
+
+template
+  using __is_nothrow_assignable_impl
+= __is_nt_assignable_impl<__is_assignable(T, Arg), T, Arg>;
+
+template
+  struct __is_nothrow_copy_assignable_impl
+  : public __is_nothrow_assignable_impl
+  { };
+
+template
+  struct is_nothrow_copy_assignable
+  : public __is_nothrow_copy_assignable_impl::type
+  { };
+
+struct NType
+{
+  NType();
+private:
+  NType(const NType&);
+  NType& operator=(const NType&);
+};
+
+
+static_assert( !is_nothrow_copy_constructible::value, "" );
+static_assert( !is_nothrow_copy_assignable::value, "" );


[PATCH] c++: Fix access checking for __is_assignable and __is_constructible (c++/94197)

2020-03-16 Thread Ville Voutilainen via Gcc-patches
Tested on Linux-PPC64.

This ain't no regression. But it seems to hamper attempts to fix library
regressions (see https://gcc.gnu.org/bugzilla/show_bug.cgi?id=94033).

2020-03-16  Ville Voutilainen  

gcc/

PR c++/94197
* cp/method.c (assignable_expr, constructible_expr): Push
a deferred access check for the stub object.

testsuite/

PR c++/94197
* g++.dg/ext/pr94197.C: New.
diff --git a/gcc/cp/method.c b/gcc/cp/method.c
index 790d5704092..b429ea48049 100644
--- a/gcc/cp/method.c
+++ b/gcc/cp/method.c
@@ -1739,11 +1739,11 @@ check_nontriv (tree *tp, int *, void *)
 static tree
 assignable_expr (tree to, tree from)
 {
-  ++cp_unevaluated_operand;
+  cp_unevaluated cp_uneval_guard;
+  deferring_access_check_sentinel acs (dk_no_deferred);
   to = build_stub_object (to);
   from = build_stub_object (from);
   tree r = cp_build_modify_expr (input_location, to, NOP_EXPR, from, tf_none);
-  --cp_unevaluated_operand;
   return r;
 }
 
@@ -1759,6 +1759,7 @@ constructible_expr (tree to, tree from)
 {
   tree expr;
   cp_unevaluated cp_uneval_guard;
+  deferring_access_check_sentinel acs (dk_no_deferred);
   if (CLASS_TYPE_P (to))
 {
   tree ctype = to;
diff --git a/gcc/testsuite/g++.dg/ext/pr94197.C b/gcc/testsuite/g++.dg/ext/pr94197.C
new file mode 100644
index 000..768bfbac0a6
--- /dev/null
+++ b/gcc/testsuite/g++.dg/ext/pr94197.C
@@ -0,0 +1,75 @@
+// { dg-do compile }
+// { dg-options "-std=c++11" }
+
+template
+  T&& declval() noexcept;
+
+template
+struct bool_constant
+{
+  static constexpr bool value = B;
+  using type = bool_constant;
+};
+
+using true_type = bool_constant;
+using false_type = bool_constant;
+
+template
+  struct __is_nt_constructible_impl
+  : public false_type
+  { };
+
+template
+  struct __is_nt_constructible_impl
+  : public bool_constant(declval()))>
+  { };
+
+template
+  using __is_nothrow_constructible_impl
+= __is_nt_constructible_impl<__is_constructible(T, Arg), T, Arg>;
+
+template
+  struct __is_nothrow_copy_constructible_impl
+  : public __is_nothrow_constructible_impl
+  { };
+
+template
+  struct is_nothrow_copy_constructible
+  : public __is_nothrow_copy_constructible_impl::type
+  { };
+
+template
+  struct __is_nt_assignable_impl
+  : public false_type
+  { };
+
+template
+  struct __is_nt_assignable_impl
+  : public bool_constant() = declval())>
+  { };
+
+template
+  using __is_nothrow_assignable_impl
+= __is_nt_assignable_impl<__is_assignable(T, Arg), T, Arg>;
+
+template
+  struct __is_nothrow_copy_assignable_impl
+  : public __is_nothrow_assignable_impl
+  { };
+
+template
+  struct is_nothrow_copy_assignable
+  : public __is_nothrow_copy_assignable_impl::type
+  { };
+
+struct NType
+{
+  NType();
+private:
+  NType(const NType&);
+  NType& operator=(const NType&);
+};
+
+
+static_assert( !is_nothrow_copy_constructible::value, "" );
+static_assert( !is_nothrow_copy_assignable::value, "" );