Commit 96975b11 by Jason Merrill Committed by Jason Merrill

PR c++/85214 - ICE with alias, generic lambda, constexpr if.

Here, since the condition for the constexpr if depends on the type of 'j',
it's still dependent when we are partially instantiating the inner lambda,
so we need to defer instantiating the constexpr if.  When we instantiated
the inner lambda, we tried to substitute into the typename, which failed
because we didn't have a declaration of 'i' available.

Fixed by teaching extract_locals_r to capture local typedefs such as 'ar';
if we have the typedef handy, we don't need to substitute into its
definition.

	* pt.c (extract_locals_r): Remember local typedefs.

From-SVN: r259185
parent e1c7971b
2018-04-06 Jason Merrill <jason@redhat.com>
PR c++/85214 - ICE with alias, generic lambda, constexpr if.
* pt.c (extract_locals_r): Remember local typedefs.
2018-04-06 David Malcolm <dmalcolm@redhat.com> 2018-04-06 David Malcolm <dmalcolm@redhat.com>
PR c++/84269 PR c++/84269
......
...@@ -11610,6 +11610,11 @@ extract_locals_r (tree *tp, int */*walk_subtrees*/, void *data_) ...@@ -11610,6 +11610,11 @@ extract_locals_r (tree *tp, int */*walk_subtrees*/, void *data_)
el_data &data = *reinterpret_cast<el_data*>(data_); el_data &data = *reinterpret_cast<el_data*>(data_);
tree *extra = &data.extra; tree *extra = &data.extra;
tsubst_flags_t complain = data.complain; tsubst_flags_t complain = data.complain;
if (TYPE_P (*tp) && typedef_variant_p (*tp))
/* Remember local typedefs (85214). */
tp = &TYPE_NAME (*tp);
if (TREE_CODE (*tp) == DECL_EXPR) if (TREE_CODE (*tp) == DECL_EXPR)
data.internal.add (DECL_EXPR_DECL (*tp)); data.internal.add (DECL_EXPR_DECL (*tp));
else if (tree spec = retrieve_local_specialization (*tp)) else if (tree spec = retrieve_local_specialization (*tp))
......
// PR c++/85214
// { dg-additional-options -std=c++17 }
struct g {
constexpr operator int() { return true; }
};
template <typename T, typename U> constexpr bool m = true;
template <long L> struct C { typedef double q; };
void ao() {
[](auto i) {
using ar = typename C<i>::q;
[](auto j) {
using as = typename C<j>::q;
if constexpr (m<ar, as>) {}
}(g());
}(g());
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment