aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorNathan Sidwell <nathan@acm.org>2017-01-31 18:05:37 +0000
committerNathan Sidwell <nathan@gcc.gnu.org>2017-01-31 18:05:37 +0000
commitde3fbef690ab0c8c4631ea0359d0500fa22ff1a9 (patch)
treef62703550f7fe7d4d981807650c925ba802fa29a /gcc
parent1a5bac38b5dadab15477a9beb3c888a888539a26 (diff)
downloadgcc-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/ChangeLog6
-rw-r--r--gcc/cp/pt.c17
-rw-r--r--gcc/testsuite/ChangeLog7
-rw-r--r--gcc/testsuite/g++.dg/cpp1y/pr67273.C16
-rw-r--r--gcc/testsuite/g++.dg/cpp1y/pr79253.C33
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); }
+ };
+};