diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index e71b4fbe9d8..ba323bf7c20 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,8 @@ +2018-04-06 Jason Merrill + + PR c++/85214 - ICE with alias, generic lambda, constexpr if. + * pt.c (extract_locals_r): Remember local typedefs. + 2018-04-06 David Malcolm PR c++/84269 diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index 450ffaec9be..db3d7e38d85 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -11610,6 +11610,11 @@ extract_locals_r (tree *tp, int */*walk_subtrees*/, void *data_) el_data &data = *reinterpret_cast(data_); tree *extra = &data.extra; 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) data.internal.add (DECL_EXPR_DECL (*tp)); else if (tree spec = retrieve_local_specialization (*tp)) diff --git a/gcc/testsuite/g++.dg/cpp1z/constexpr-if20.C b/gcc/testsuite/g++.dg/cpp1z/constexpr-if20.C new file mode 100644 index 00000000000..24343adb748 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1z/constexpr-if20.C @@ -0,0 +1,17 @@ +// PR c++/85214 +// { dg-additional-options -std=c++17 } + +struct g { + constexpr operator int() { return true; } +}; +template constexpr bool m = true; +template struct C { typedef double q; }; +void ao() { + [](auto i) { + using ar = typename C::q; + [](auto j) { + using as = typename C::q; + if constexpr (m) {} + }(g()); + }(g()); +}