aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2018-07-17 11:39:46 -0400
committerJason Merrill <jason@gcc.gnu.org>2018-07-17 11:39:46 -0400
commitdd00049ae93c8dd0feba1702be3f2c2ebeb92189 (patch)
tree2e0af16d30f8792aa1dfb750d65d15b397166a93
parentc3be340eb67fff7ef353d37bd02898f295ea0ef1 (diff)
downloadgcc-dd00049ae93c8dd0feba1702be3f2c2ebeb92189.zip
gcc-dd00049ae93c8dd0feba1702be3f2c2ebeb92189.tar.gz
gcc-dd00049ae93c8dd0feba1702be3f2c2ebeb92189.tar.bz2
PR c++/86480 - nested variadic lambda and constexpr if.
* pt.c (find_parameter_packs_r) [IF_STMT]: Don't walk into IF_STMT_EXTRA_ARGS. * tree.c (cp_walk_subtrees) [DECLTYPE_TYPE]: Set cp_unevaluated_operand. [ALIGNOF_EXPR] [SIZEOF_EXPR] [NOEXCEPT_EXPR]: Likewise. From-SVN: r262825
-rw-r--r--gcc/cp/ChangeLog9
-rw-r--r--gcc/cp/pt.c11
-rw-r--r--gcc/cp/tree.c14
-rw-r--r--gcc/testsuite/g++.dg/cpp1z/constexpr-if24.C21
4 files changed, 54 insertions, 1 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 6c1384a..f6f4398 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,12 @@
+2018-07-17 Jason Merrill <jason@redhat.com>
+
+ PR c++/86480 - nested variadic lambda and constexpr if.
+ * pt.c (find_parameter_packs_r) [IF_STMT]: Don't walk into
+ IF_STMT_EXTRA_ARGS.
+ * tree.c (cp_walk_subtrees) [DECLTYPE_TYPE]: Set
+ cp_unevaluated_operand.
+ [ALIGNOF_EXPR] [SIZEOF_EXPR] [NOEXCEPT_EXPR]: Likewise.
+
2018-07-16 Paolo Carlini <paolo.carlini@oracle.com>
* class.c (resolve_address_of_overloaded_function): Don't emit an
diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c
index b49dce0..2780504 100644
--- a/gcc/cp/pt.c
+++ b/gcc/cp/pt.c
@@ -3865,6 +3865,17 @@ find_parameter_packs_r (tree *tp, int *walk_subtrees, void* data)
return NULL_TREE;
}
+ case IF_STMT:
+ cp_walk_tree (&IF_COND (t), &find_parameter_packs_r,
+ ppd, ppd->visited);
+ cp_walk_tree (&THEN_CLAUSE (t), &find_parameter_packs_r,
+ ppd, ppd->visited);
+ cp_walk_tree (&ELSE_CLAUSE (t), &find_parameter_packs_r,
+ ppd, ppd->visited);
+ /* Don't walk into IF_STMT_EXTRA_ARGS. */
+ *walk_subtrees = 0;
+ return NULL_TREE;
+
default:
return NULL_TREE;
}
diff --git a/gcc/cp/tree.c b/gcc/cp/tree.c
index b1333f5..7e2a77b 100644
--- a/gcc/cp/tree.c
+++ b/gcc/cp/tree.c
@@ -4865,7 +4865,19 @@ cp_walk_subtrees (tree *tp, int *walk_subtrees_p, walk_tree_fn func,
break;
case DECLTYPE_TYPE:
- WALK_SUBTREE (DECLTYPE_TYPE_EXPR (*tp));
+ ++cp_unevaluated_operand;
+ /* We can't use WALK_SUBTREE here because of the goto. */
+ result = cp_walk_tree (&DECLTYPE_TYPE_EXPR (*tp), func, data, pset);
+ --cp_unevaluated_operand;
+ *walk_subtrees_p = 0;
+ break;
+
+ case ALIGNOF_EXPR:
+ case SIZEOF_EXPR:
+ case NOEXCEPT_EXPR:
+ ++cp_unevaluated_operand;
+ result = cp_walk_tree (&TREE_OPERAND (*tp, 0), func, data, pset);
+ --cp_unevaluated_operand;
*walk_subtrees_p = 0;
break;
diff --git a/gcc/testsuite/g++.dg/cpp1z/constexpr-if24.C b/gcc/testsuite/g++.dg/cpp1z/constexpr-if24.C
new file mode 100644
index 0000000..cbdb38d
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp1z/constexpr-if24.C
@@ -0,0 +1,21 @@
+// PR c++/86480
+// { dg-additional-options -std=c++17 }
+
+template <class...> constexpr bool val = true;
+
+template <class... T>
+void f()
+{
+ [](auto... p)
+ {
+ []{
+ if constexpr (val<T..., decltype(p)...>) { return true; }
+ return false;
+ }();
+ }(42);
+}
+
+int main()
+{
+ f<int>();
+}