2017-01-31 Nathan Sidwell <nathan@acm.org>
+ PR c++/67273
+ PR c++/79253
+ * pt.c: (instantiate_decl): Push to top level when current
+ function scope doesn't match. Only push lmabda scope stack when
+ pushing to top.
+
* cp-tree.h (instantiate_decl): Make defer_ok bool.
* pt.c: Fix instantiate_decl calls to pass true/false not 0/1
(instantiate_decl): Simplify and reorder state saving and restoration.
goto out;
}
- bool nested;
+ bool push_to_top, nested;
tree fn_context;
fn_context = decl_function_context (d);
- nested = (current_function_decl != NULL_TREE);
+ nested = current_function_decl != NULL_TREE;
+ push_to_top = !(nested && fn_context == current_function_decl);
+
vec<tree> omp_privatization_save;
if (nested)
save_omp_privatization_clauses (omp_privatization_save);
- if (!fn_context)
+ if (push_to_top)
push_to_top_level ();
else
{
- if (nested)
- push_function_context ();
+ push_function_context ();
cp_unevaluated_operand = 0;
c_inhibit_evaluation_warnings = 0;
}
block = push_stmt_list ();
else
{
- if (LAMBDA_FUNCTION_P (d))
+ if (push_to_top && LAMBDA_FUNCTION_P (d))
{
/* When instantiating a lambda's templated function
operator, we need to push the non-lambda class scope
/* We're not deferring instantiation any more. */
TI_PENDING_TEMPLATE_FLAG (DECL_TEMPLATE_INFO (d)) = 0;
- if (!fn_context)
+ if (push_to_top)
pop_from_top_level ();
- else if (nested)
+ else
pop_function_context ();
if (nested)
+2017-01-31 Nathan Sidwell <nathan@acm.org>
+
+ PR c++/67273
+ PR c++/79253
+ * g++.dg/cpp1y/pr67273.C: New.
+ * g++.dg/cpp1y/pr79253.C: New.
+
2017-01-31 Nathan Sidwell <nathan@acm.org>
PR c++/79264
--- /dev/null
+// { dg-do compile { target c++14 } }
+// { dg-additional-options "-Wshadow" }
+
+// pr67273 bogus warning about shadowing.
+
+
+template <typename T> void Foo (T &&lambda)
+{
+ int ARG = 2;
+ lambda (1);
+}
+
+void Baz ()
+{
+ Foo ([] (auto &&ARG) {});
+}
--- /dev/null
+// { dg-do compile { target c++14 } }
+// PR 79253 ICE instantiating lambda body.
+
+template <typename> struct A;
+template <typename = A<int>> class B {};
+template <class T, class U, class V> void foo (U, V) { T (0, 0); }
+struct C {};
+template <template <bool, bool, bool> class F, class>
+void
+bar ()
+{
+ F<0, 0, 0>::baz;
+}
+struct G { int l; };
+template <int, int, int> struct E : C
+{
+ E (int, int) : e (0)
+ {
+ auto &m = this->m ();
+ auto c = [&] { m.l; };
+ }
+ G &m ();
+ int e;
+};
+struct D
+{
+ void
+ baz () { bar<F, B<>>; }
+ template <bool, bool, bool> struct F
+ {
+ static B<> baz () { foo<E<0, 0, 0>> (0, 0); }
+ };
+};