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
This commit is contained in:
parent
1a5bac38b5
commit
de3fbef690
5 changed files with 71 additions and 8 deletions
|
@ -1,5 +1,11 @@
|
|||
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.
|
||||
|
|
17
gcc/cp/pt.c
17
gcc/cp/pt.c
|
@ -22666,20 +22666,21 @@ instantiate_decl (tree d, bool defer_ok, bool expl_inst_class_mem_p)
|
|||
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;
|
||||
}
|
||||
|
@ -22756,7 +22757,7 @@ instantiate_decl (tree d, bool defer_ok, bool expl_inst_class_mem_p)
|
|||
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
|
||||
|
@ -22849,9 +22850,9 @@ instantiate_decl (tree d, bool defer_ok, bool expl_inst_class_mem_p)
|
|||
/* 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)
|
||||
|
|
|
@ -1,3 +1,10 @@
|
|||
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
|
||||
|
|
16
gcc/testsuite/g++.dg/cpp1y/pr67273.C
Normal file
16
gcc/testsuite/g++.dg/cpp1y/pr67273.C
Normal file
|
@ -0,0 +1,16 @@
|
|||
// { 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) {});
|
||||
}
|
33
gcc/testsuite/g++.dg/cpp1y/pr79253.C
Normal file
33
gcc/testsuite/g++.dg/cpp1y/pr79253.C
Normal file
|
@ -0,0 +1,33 @@
|
|||
// { 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); }
|
||||
};
|
||||
};
|
Loading…
Add table
Reference in a new issue