From 57ea03ad4a0dde989d1c38a0028378964104bbd7 Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Sat, 2 Jun 2018 21:01:47 -0400 Subject: [PATCH] PR c++/85761 - ICE with ill-formed use of const outer variable. * expr.c (mark_use): Handle location wrappers. From-SVN: r261121 --- gcc/cp/ChangeLog | 5 +++++ gcc/cp/expr.c | 8 ++++++++ .../g++.dg/cpp0x/lambda/lambda-const8.C | 19 +++++++++++++++++++ 3 files changed, 32 insertions(+) create mode 100644 gcc/testsuite/g++.dg/cpp0x/lambda/lambda-const8.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index bbf76eabb15..c661d46c99a 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,8 @@ +2018-06-02 Jason Merrill + + PR c++/85761 - ICE with ill-formed use of const outer variable. + * expr.c (mark_use): Handle location wrappers. + 2018-06-01 Jason Merrill PR c++/85764 - bogus 'this' not captured error. diff --git a/gcc/cp/expr.c b/gcc/cp/expr.c index 0d0a10ec4a6..9780b75d1cd 100644 --- a/gcc/cp/expr.c +++ b/gcc/cp/expr.c @@ -139,6 +139,9 @@ mark_use (tree expr, bool rvalue_p, bool read_p, break; } } + temp_override l (input_location); + if (loc != UNKNOWN_LOCATION) + input_location = loc; expr = process_outer_var_ref (expr, tf_warning_or_error, true); if (!(TREE_TYPE (oexpr) && TYPE_REF_P (TREE_TYPE (oexpr)))) @@ -184,6 +187,11 @@ mark_use (tree expr, bool rvalue_p, bool read_p, } break; default: + if (location_wrapper_p (expr)) + { + loc = EXPR_LOCATION (expr); + recurse_op[0] = true; + } break; } diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-const8.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-const8.C new file mode 100644 index 00000000000..41cfd43b3a7 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-const8.C @@ -0,0 +1,19 @@ +// PR c++/85761 +// { dg-do compile { target c++11 } } + +template +void out(const T& value); + +struct foo { + void bar(); +}; + +void foo::bar() +{ + constexpr int COUNT = 10000; + auto run = []() { + out(COUNT); // { dg-error "9:not captured" } + }; + + run(); +} -- 2.30.2