Commit de3fbef6 by Nathan Sidwell Committed by Nathan Sidwell

re PR c++/67273 (Incorrect -Wshadow warning with generic lambdas)

	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.

	PR c++/67273
	PR c++/79253
	* g++.dg/cpp1y/pr67273.C: New.
	* g++.dg/cpp1y/pr79253.C: New.

From-SVN: r245067
parent 1a5bac38
2017-01-31 Nathan Sidwell <nathan@acm.org> 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. * cp-tree.h (instantiate_decl): Make defer_ok bool.
* pt.c: Fix instantiate_decl calls to pass true/false not 0/1 * pt.c: Fix instantiate_decl calls to pass true/false not 0/1
(instantiate_decl): Simplify and reorder state saving and restoration. (instantiate_decl): Simplify and reorder state saving and restoration.
......
...@@ -22666,20 +22666,21 @@ instantiate_decl (tree d, bool defer_ok, bool expl_inst_class_mem_p) ...@@ -22666,20 +22666,21 @@ instantiate_decl (tree d, bool defer_ok, bool expl_inst_class_mem_p)
goto out; goto out;
} }
bool nested; bool push_to_top, nested;
tree fn_context; tree fn_context;
fn_context = decl_function_context (d); 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; vec<tree> omp_privatization_save;
if (nested) if (nested)
save_omp_privatization_clauses (omp_privatization_save); save_omp_privatization_clauses (omp_privatization_save);
if (!fn_context) if (push_to_top)
push_to_top_level (); push_to_top_level ();
else else
{ {
if (nested) push_function_context ();
push_function_context ();
cp_unevaluated_operand = 0; cp_unevaluated_operand = 0;
c_inhibit_evaluation_warnings = 0; c_inhibit_evaluation_warnings = 0;
} }
...@@ -22756,7 +22757,7 @@ instantiate_decl (tree d, bool defer_ok, bool expl_inst_class_mem_p) ...@@ -22756,7 +22757,7 @@ instantiate_decl (tree d, bool defer_ok, bool expl_inst_class_mem_p)
block = push_stmt_list (); block = push_stmt_list ();
else else
{ {
if (LAMBDA_FUNCTION_P (d)) if (push_to_top && LAMBDA_FUNCTION_P (d))
{ {
/* When instantiating a lambda's templated function /* When instantiating a lambda's templated function
operator, we need to push the non-lambda class scope operator, we need to push the non-lambda class scope
...@@ -22849,9 +22850,9 @@ instantiate_decl (tree d, bool defer_ok, bool expl_inst_class_mem_p) ...@@ -22849,9 +22850,9 @@ instantiate_decl (tree d, bool defer_ok, bool expl_inst_class_mem_p)
/* We're not deferring instantiation any more. */ /* We're not deferring instantiation any more. */
TI_PENDING_TEMPLATE_FLAG (DECL_TEMPLATE_INFO (d)) = 0; TI_PENDING_TEMPLATE_FLAG (DECL_TEMPLATE_INFO (d)) = 0;
if (!fn_context) if (push_to_top)
pop_from_top_level (); pop_from_top_level ();
else if (nested) else
pop_function_context (); pop_function_context ();
if (nested) if (nested)
......
2017-01-31 Nathan Sidwell <nathan@acm.org> 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 PR c++/79264
* g++.dg/cpp1y/pr61636-1.C: Augment. * g++.dg/cpp1y/pr61636-1.C: Augment.
......
// { 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) {});
}
// { 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); }
};
};
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