diff options
author | Ryan Burn <contact@rnburn.com> | 2015-11-25 22:13:23 +0000 |
---|---|---|
committer | Jason Merrill <jason@gcc.gnu.org> | 2015-11-25 17:13:23 -0500 |
commit | a0c0e716fa4fbdda4ee6c864de1eda284f1547ce (patch) | |
tree | 3373f7297e990618b02db7c30e9cfbf833a89311 | |
parent | 75729cff1ebd87576916e99cd539b0c9223e5d99 (diff) | |
download | gcc-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/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/cp/pt.c | 12 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/concepts/pr68434.C | 21 |
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); |