aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNathan Sidwell <nathan@acm.org>2018-03-20 16:01:08 +0000
committerNathan Sidwell <nathan@gcc.gnu.org>2018-03-20 16:01:08 +0000
commit6f87580f7d0726d9683ca0f4a703a857f06f00d5 (patch)
tree43d5d82e71d5996f0efb9273f8c4a2ac482b8726
parent5770bbac66da20acd60a488430dff494db6606b4 (diff)
downloadgcc-6f87580f7d0726d9683ca0f4a703a857f06f00d5.zip
gcc-6f87580f7d0726d9683ca0f4a703a857f06f00d5.tar.gz
gcc-6f87580f7d0726d9683ca0f4a703a857f06f00d5.tar.bz2
[PR c++/84962] ICE with anon-struct member
https://gcc.gnu.org/ml/gcc-patches/2018-03/msg00961.html PR c++/84962 * name-lookup.c (pushdecl_class_level): Push anon-struct's member_vec, if there is one. PR c++/84962 * g++.dg/lookup/pr84962.C: New. From-SVN: r258686
-rw-r--r--gcc/cp/ChangeLog4
-rw-r--r--gcc/cp/name-lookup.c32
-rw-r--r--gcc/testsuite/ChangeLog3
-rw-r--r--gcc/testsuite/g++.dg/lookup/pr84962.C14
4 files changed, 44 insertions, 9 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 7ce79d3..5d7b9c0 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,5 +1,9 @@
2018-03-20 Nathan Sidwell <nathan@acm.org>
+ PR c++/84962
+ * name-lookup.c (pushdecl_class_level): Push anon-struct's
+ member_vec, if there is one.
+
PR c++/84970
* cp-tree.h (lookup_list_keep): Declare.
* tree.c (lookup_list_keep): New, broken out of ...
diff --git a/gcc/cp/name-lookup.c b/gcc/cp/name-lookup.c
index cc8bb2f..411a796 100644
--- a/gcc/cp/name-lookup.c
+++ b/gcc/cp/name-lookup.c
@@ -4490,16 +4490,30 @@ pushdecl_class_level (tree x)
/* If X is an anonymous aggregate, all of its members are
treated as if they were members of the class containing the
aggregate, for naming purposes. */
- tree f;
-
- for (f = TYPE_FIELDS (TREE_TYPE (x)); f; f = DECL_CHAIN (f))
- {
- location_t save_location = input_location;
- input_location = DECL_SOURCE_LOCATION (f);
- if (!pushdecl_class_level (f))
- is_valid = false;
- input_location = save_location;
+ location_t save_location = input_location;
+ tree anon = TREE_TYPE (x);
+ if (vec<tree, va_gc> *member_vec = CLASSTYPE_MEMBER_VEC (anon))
+ for (unsigned ix = member_vec->length (); ix--;)
+ {
+ tree binding = (*member_vec)[ix];
+ if (STAT_HACK_P (binding))
+ {
+ if (!pushdecl_class_level (STAT_TYPE (binding)))
+ is_valid = false;
+ binding = STAT_DECL (binding);
+ }
+ if (!pushdecl_class_level (binding))
+ is_valid = false;
}
+ else
+ for (tree f = TYPE_FIELDS (anon); f; f = DECL_CHAIN (f))
+ if (TREE_CODE (f) == FIELD_DECL)
+ {
+ input_location = DECL_SOURCE_LOCATION (f);
+ if (!pushdecl_class_level (f))
+ is_valid = false;
+ }
+ input_location = save_location;
}
timevar_cond_stop (TV_NAME_LOOKUP, subtime);
return is_valid;
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 14c775b..21a16df 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,5 +1,8 @@
2018-03-20 Nathan Sidwell <nathan@acm.org>
+ PR c++/84962
+ * g++.dg/lookup/pr84962.C: New.
+
PR c++/84970
* g++.dg/lookup/pr84970.C: New.
diff --git a/gcc/testsuite/g++.dg/lookup/pr84962.C b/gcc/testsuite/g++.dg/lookup/pr84962.C
new file mode 100644
index 0000000..ee801c2
--- /dev/null
+++ b/gcc/testsuite/g++.dg/lookup/pr84962.C
@@ -0,0 +1,14 @@
+// PR c++/84952 ICE with anon-struct having member fns
+// { dg-do compile { target c++11 } }
+// { dg-additional-options -Wno-pedantic }
+
+struct X {
+ struct
+ {
+ template <typename> int a ();
+ // { dg-error "can only have" "" { target *-*-* } .-1 }
+ };
+
+ int : a; // { dg-error "non-integral" }
+};
+