aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2018-06-16 02:35:53 -0400
committerJason Merrill <jason@gcc.gnu.org>2018-06-16 02:35:53 -0400
commit94aedc1c0e27aca2b473c35172b564520a7a63ee (patch)
tree31f92d67260c8bad14fd3f0b39ef7bd2d8a5dcdb
parent29305f6018483963fa79b072cf8e95128f3e2cd8 (diff)
downloadgcc-94aedc1c0e27aca2b473c35172b564520a7a63ee.zip
gcc-94aedc1c0e27aca2b473c35172b564520a7a63ee.tar.gz
gcc-94aedc1c0e27aca2b473c35172b564520a7a63ee.tar.bz2
PR c++/86147 - wrong capture for template argument.
* expr.c (mark_use): Look through NOP_EXPR. From-SVN: r261676
-rw-r--r--gcc/cp/ChangeLog3
-rw-r--r--gcc/cp/expr.c13
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/lambda/lambda-const9.C17
3 files changed, 28 insertions, 5 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 56fe205..2e341f1 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,5 +1,8 @@
2018-06-15 Jason Merrill <jason@redhat.com>
+ PR c++/86147 - wrong capture for template argument.
+ * expr.c (mark_use): Look through NOP_EXPR.
+
* name-lookup.c (do_pushtag): Don't look through complete types, but
don't add to them either. Get context from current_binding_level.
* pt.c (tsubst_default_argument): Use push_to/pop_from_top_level.
diff --git a/gcc/cp/expr.c b/gcc/cp/expr.c
index 9780b75..133a01b 100644
--- a/gcc/cp/expr.c
+++ b/gcc/cp/expr.c
@@ -186,12 +186,15 @@ mark_use (tree expr, bool rvalue_p, bool read_p,
expr = convert_from_reference (r);
}
break;
- default:
+
+ CASE_CONVERT:
+ case VIEW_CONVERT_EXPR:
if (location_wrapper_p (expr))
- {
- loc = EXPR_LOCATION (expr);
- recurse_op[0] = true;
- }
+ loc = EXPR_LOCATION (expr);
+ recurse_op[0] = true;
+ break;
+
+ default:
break;
}
diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-const9.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-const9.C
new file mode 100644
index 0000000..0724ae1
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-const9.C
@@ -0,0 +1,17 @@
+// PR c++/86147
+// { dg-do compile { target c++11 } }
+
+template <class T, T N> struct X { };
+
+struct A { static constexpr int value = 0; };
+
+template<class C>
+void foo() {
+ constexpr int N = C::value;
+ auto f = [&]{ X<int, N> a; };
+}
+
+int main() {
+ foo<A>();
+ return 0;
+}