aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/name-lookup.cc8
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/lambda/lambda-__func__3.C6
2 files changed, 11 insertions, 3 deletions
diff --git a/gcc/cp/name-lookup.cc b/gcc/cp/name-lookup.cc
index 7fadbcc..1cd982e 100644
--- a/gcc/cp/name-lookup.cc
+++ b/gcc/cp/name-lookup.cc
@@ -5204,9 +5204,11 @@ pushdecl_outermost_localscope (tree x)
cp_binding_level *b = NULL;
auto_cond_timevar tv (TV_NAME_LOOKUP);
- /* Find the scope just inside the function parms. */
- for (cp_binding_level *n = current_binding_level;
- n->kind != sk_function_parms; n = b->level_chain)
+ /* Find the block scope just inside the function parms. */
+ cp_binding_level *n = current_binding_level;
+ while (n && n->kind != sk_block)
+ n = n->level_chain;
+ for (; n && n->kind != sk_function_parms; n = b->level_chain)
b = n;
return b ? do_pushdecl_with_scope (x, b) : error_mark_node;
diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-__func__3.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-__func__3.C
new file mode 100644
index 0000000..50ad6e5
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-__func__3.C
@@ -0,0 +1,6 @@
+// PR c++/118629
+// { dg-do compile { target c++11 } }
+
+void foo() {
+ []() -> decltype(+__FUNCTION__) { return nullptr; };
+}