diff options
author | Nathan Sidwell <nathan@acm.org> | 2017-01-31 18:05:37 +0000 |
---|---|---|
committer | Nathan Sidwell <nathan@gcc.gnu.org> | 2017-01-31 18:05:37 +0000 |
commit | de3fbef690ab0c8c4631ea0359d0500fa22ff1a9 (patch) | |
tree | f62703550f7fe7d4d981807650c925ba802fa29a /gcc | |
parent | 1a5bac38b5dadab15477a9beb3c888a888539a26 (diff) | |
download | gcc-de3fbef690ab0c8c4631ea0359d0500fa22ff1a9.zip gcc-de3fbef690ab0c8c4631ea0359d0500fa22ff1a9.tar.gz gcc-de3fbef690ab0c8c4631ea0359d0500fa22ff1a9.tar.bz2 |
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
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/cp/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/cp/pt.c | 17 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp1y/pr67273.C | 16 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp1y/pr79253.C | 33 |
5 files changed, 71 insertions, 8 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 5df2f72..78a5725 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -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. diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index bd39ee3..c69c270 100644 --- a/gcc/cp/pt.c +++ b/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) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 675c190..922fe64 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,12 @@ 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 * g++.dg/cpp1y/pr61636-1.C: Augment. diff --git a/gcc/testsuite/g++.dg/cpp1y/pr67273.C b/gcc/testsuite/g++.dg/cpp1y/pr67273.C new file mode 100644 index 0000000..d2bc035 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1y/pr67273.C @@ -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) {}); +} diff --git a/gcc/testsuite/g++.dg/cpp1y/pr79253.C b/gcc/testsuite/g++.dg/cpp1y/pr79253.C new file mode 100644 index 0000000..b15efe8 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1y/pr79253.C @@ -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); } + }; +}; |