aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRyan Burn <contact@rnburn.com>2015-11-25 22:13:23 +0000
committerJason Merrill <jason@gcc.gnu.org>2015-11-25 17:13:23 -0500
commita0c0e716fa4fbdda4ee6c864de1eda284f1547ce (patch)
tree3373f7297e990618b02db7c30e9cfbf833a89311
parent75729cff1ebd87576916e99cd539b0c9223e5d99 (diff)
downloadgcc-a0c0e716fa4fbdda4ee6c864de1eda284f1547ce.zip
gcc-a0c0e716fa4fbdda4ee6c864de1eda284f1547ce.tar.gz
gcc-a0c0e716fa4fbdda4ee6c864de1eda284f1547ce.tar.bz2
re PR c++/68434 ([concepts] function tsubst sets TYPE_CANONICAL before setting a type's PLACEHOLDER_TYPE_CONSTRAINTS)
PR c++/68434 * pt.c (tsubst): Set PLACEHOLDER_TYPE_CONSTRAINTS before calling canonical_type_parameter. From-SVN: r230909
-rw-r--r--gcc/cp/ChangeLog6
-rw-r--r--gcc/cp/pt.c12
-rw-r--r--gcc/testsuite/g++.dg/concepts/pr68434.C21
3 files changed, 33 insertions, 6 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 900d864..52ca12f 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,9 @@
+2015-11-25 Ryan Burn <contact@rnburn.com>
+
+ PR c++/68434
+ * pt.c (tsubst): Set PLACEHOLDER_TYPE_CONSTRAINTS before
+ calling canonical_type_parameter.
+
2015-11-25 Jason Merrill <jason@redhat.com>
* lambda.c (maybe_add_lambda_conv_op): Only set
diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c
index 5868be2..2432283 100644
--- a/gcc/cp/pt.c
+++ b/gcc/cp/pt.c
@@ -12977,6 +12977,12 @@ tsubst (tree t, tree args, tsubst_flags_t complain, tree in_decl)
TYPE_POINTER_TO (r) = NULL_TREE;
TYPE_REFERENCE_TO (r) = NULL_TREE;
+ /* Propagate constraints on placeholders. */
+ if (TREE_CODE (t) == TEMPLATE_TYPE_PARM)
+ if (tree constr = PLACEHOLDER_TYPE_CONSTRAINTS (t))
+ PLACEHOLDER_TYPE_CONSTRAINTS (r)
+ = tsubst_constraint (constr, args, complain, in_decl);
+
if (TREE_CODE (r) == TEMPLATE_TEMPLATE_PARM)
/* We have reduced the level of the template
template parameter, but not the levels of its
@@ -12991,12 +12997,6 @@ tsubst (tree t, tree args, tsubst_flags_t complain, tree in_decl)
else
TYPE_CANONICAL (r) = canonical_type_parameter (r);
- /* Propagate constraints on placeholders. */
- if (TREE_CODE (t) == TEMPLATE_TYPE_PARM)
- if (tree constr = PLACEHOLDER_TYPE_CONSTRAINTS (t))
- PLACEHOLDER_TYPE_CONSTRAINTS (r)
- = tsubst_constraint (constr, args, complain, in_decl);
-
if (code == BOUND_TEMPLATE_TEMPLATE_PARM)
{
tree argvec = tsubst (TYPE_TI_ARGS (t), args,
diff --git a/gcc/testsuite/g++.dg/concepts/pr68434.C b/gcc/testsuite/g++.dg/concepts/pr68434.C
new file mode 100644
index 0000000..d5f901a
--- /dev/null
+++ b/gcc/testsuite/g++.dg/concepts/pr68434.C
@@ -0,0 +1,21 @@
+// { dg-options "-std=c++1z" }
+
+template <class>
+concept bool C1 () {
+ return true;
+}
+
+template <class>
+concept bool C2 () {
+ return true;
+}
+
+template <class Expr>
+concept bool C3 () {
+ return requires (Expr expr) {
+ {expr}->C1;
+ {expr}->C2;
+ };
+}
+
+auto f (C3);