gcc/cp/ChangeLog:
        Backport of r259720 from trunk.
        2018-04-27  David Malcolm  <dmalc...@redhat.com>

        PR c++/85515
        * name-lookup.c (consider_binding_level): Skip compiler-generated
        variables.
        * search.c (lookup_field_fuzzy_info::fuzzy_lookup_field): Flatten
        nested if statements into a series of rejection tests.  Reject
        lambda-ignored entities as suggestions.

gcc/testsuite/ChangeLog:
        Backport of r259720 from trunk.
        2018-04-27  David Malcolm  <dmalc...@redhat.com>

        PR c++/85515
        * g++.dg/pr85515-1.C: New test.
        * g++.dg/pr85515-2.C: New test.
---
 gcc/cp/name-lookup.c             |  6 ++++++
 gcc/cp/search.c                  | 13 ++++++++++---
 gcc/testsuite/g++.dg/pr85515-1.C | 18 ++++++++++++++++++
 gcc/testsuite/g++.dg/pr85515-2.C | 22 ++++++++++++++++++++++
 4 files changed, 56 insertions(+), 3 deletions(-)
 create mode 100644 gcc/testsuite/g++.dg/pr85515-1.C
 create mode 100644 gcc/testsuite/g++.dg/pr85515-2.C

diff --git a/gcc/cp/name-lookup.c b/gcc/cp/name-lookup.c
index 4ce632c..86fa03b 100644
--- a/gcc/cp/name-lookup.c
+++ b/gcc/cp/name-lookup.c
@@ -5863,6 +5863,12 @@ consider_binding_level (tree name, best_match <tree, 
const char *> &bm,
          && DECL_ANTICIPATED (d))
        continue;
 
+      /* Skip compiler-generated variables (e.g. __for_begin/__for_end
+        within range for).  */
+      if (TREE_CODE (d) == VAR_DECL
+         && DECL_ARTIFICIAL (d))
+       continue;
+
       tree suggestion = DECL_NAME (d);
       if (!suggestion)
        continue;
diff --git a/gcc/cp/search.c b/gcc/cp/search.c
index ca04dca..d4214d4 100644
--- a/gcc/cp/search.c
+++ b/gcc/cp/search.c
@@ -1227,9 +1227,16 @@ lookup_field_fuzzy_info::fuzzy_lookup_field (tree type)
 
   for (tree field = TYPE_FIELDS (type); field; field = DECL_CHAIN (field))
     {
-      if (!m_want_type_p || DECL_DECLARES_TYPE_P (field))
-       if (DECL_NAME (field))
-         m_candidates.safe_push (DECL_NAME (field));
+      if (m_want_type_p && !DECL_DECLARES_TYPE_P (field))
+       continue;
+
+      if (!DECL_NAME (field))
+       continue;
+
+      if (is_lambda_ignored_entity (field))
+       continue;
+
+      m_candidates.safe_push (DECL_NAME (field));
     }
 }
 
diff --git a/gcc/testsuite/g++.dg/pr85515-1.C b/gcc/testsuite/g++.dg/pr85515-1.C
new file mode 100644
index 0000000..0e27a9d
--- /dev/null
+++ b/gcc/testsuite/g++.dg/pr85515-1.C
@@ -0,0 +1,18 @@
+// { dg-require-effective-target c++14 }
+
+void test_1 ()
+{
+  auto lambda = [val = 2](){};
+  lambda.val; // { dg-bogus "did you mean" }
+  // { dg-error "has no member named 'val'" "" { target *-*-* } .-1 }
+}
+
+int test_2 ()
+{
+  auto lambda = [val = 2](){ return val; };
+
+  // TODO: should we issue an error for the following assignment?
+  lambda.__val = 4;
+
+  return lambda();
+}
diff --git a/gcc/testsuite/g++.dg/pr85515-2.C b/gcc/testsuite/g++.dg/pr85515-2.C
new file mode 100644
index 0000000..621ddb8
--- /dev/null
+++ b/gcc/testsuite/g++.dg/pr85515-2.C
@@ -0,0 +1,22 @@
+// { dg-require-effective-target c++11 }
+
+void test_1 ()
+{
+  int arr[] = {1, 2, 3, 4, 5};
+  for (const auto v: arr) {
+    _forbegin; // { dg-bogus "suggested alternative" }
+    // { dg-error "'_forbegin' was not declared in this scope" "" { target 
*-*-*} .-1 }
+  }
+}
+
+int test_2 ()
+{
+  int arr[] = {1, 2, 3, 4, 5};
+  int sum = 0;
+  for (const auto v: arr) {
+    sum += v;
+    // TODO: should we issue an error for the following assignment?
+    __for_begin = __for_end;
+  }
+  return sum;
+}
-- 
1.8.5.3

Reply via email to