aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorDavid Malcolm <dmalcolm@redhat.com>2018-04-27 18:39:18 +0000
committerDavid Malcolm <dmalcolm@gcc.gnu.org>2018-04-27 18:39:18 +0000
commit66bd30863fe5673f902fa64a1af0a47f4911fdd2 (patch)
tree9d4bfe51102d1732770424d8fbdd728fd7a1b380 /gcc
parent2885a4939a7c96441210d6b3507524b6970d1013 (diff)
downloadgcc-66bd30863fe5673f902fa64a1af0a47f4911fdd2.zip
gcc-66bd30863fe5673f902fa64a1af0a47f4911fdd2.tar.gz
gcc-66bd30863fe5673f902fa64a1af0a47f4911fdd2.tar.bz2
Don't offer suggestions for compiler-generated variables (PR c++/85515)
gcc/cp/ChangeLog: 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: PR c++/85515 * g++.dg/pr85515-1.C: New test. * g++.dg/pr85515-2.C: New test. From-SVN: r259720
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog9
-rw-r--r--gcc/cp/name-lookup.c6
-rw-r--r--gcc/cp/search.c13
-rw-r--r--gcc/testsuite/ChangeLog6
-rw-r--r--gcc/testsuite/g++.dg/pr85515-1.C18
-rw-r--r--gcc/testsuite/g++.dg/pr85515-2.C22
6 files changed, 71 insertions, 3 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 2dbc675..d8e7089 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,12 @@
+2018-04-27 David Malcolm <dmalcolm@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.
+
2018-04-27 Jason Merrill <jason@redhat.com>
* cvt.c (cp_fold_convert): Use convert_ptrmem.
diff --git a/gcc/cp/name-lookup.c b/gcc/cp/name-lookup.c
index c1f7cf5..2af2462 100644
--- a/gcc/cp/name-lookup.c
+++ b/gcc/cp/name-lookup.c
@@ -5860,6 +5860,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 bfeaf2c..22c0492 100644
--- a/gcc/cp/search.c
+++ b/gcc/cp/search.c
@@ -1224,9 +1224,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/ChangeLog b/gcc/testsuite/ChangeLog
index a20bfd0..ce5eaba 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,9 @@
+2018-04-27 David Malcolm <dmalcolm@redhat.com>
+
+ PR c++/85515
+ * g++.dg/pr85515-1.C: New test.
+ * g++.dg/pr85515-2.C: New test.
+
2018-04-27 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/84691
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;
+}