aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFabien Chêne <fabien@gcc.gnu.org>2011-11-18 19:44:23 +0100
committerFabien Chêne <fabien@gcc.gnu.org>2011-11-18 19:44:23 +0100
commit52e4e221bd6355b1c40173724e927a0d5be6c254 (patch)
treeab52e6bc930608e5ee2b4bf6ef3c6ad0fcd7f4c6
parent4a0051e4db55a7de184bc51f9d2a03b352d16420 (diff)
downloadgcc-52e4e221bd6355b1c40173724e927a0d5be6c254.zip
gcc-52e4e221bd6355b1c40173724e927a0d5be6c254.tar.gz
gcc-52e4e221bd6355b1c40173724e927a0d5be6c254.tar.bz2
re PR c++/51141 (rev181359 causes Chromium build failure)
gcc/testsuite/ChangeLog 2011-11-18 Fabien Chene <fabien@gcc.gnu.org> PR c++/51141 * g++.dg/lookup/using46.C: New. * g++.dg/lookup/using47.C: New. * g++.dg/lookup/using48.C: New. * g++.dg/lookup/using49.C: New. * g++.dg/lookup/using50.C: New. gcc/cp/ChangeLog 2011-11-18 Fabien Chene <fabien@gcc.gnu.org> PR c++/51141 * search.c (lookup_field_1): Handle USING_DECLs for the storted case. From-SVN: r181490
-rw-r--r--gcc/cp/ChangeLog6
-rw-r--r--gcc/cp/search.c8
-rw-r--r--gcc/testsuite/ChangeLog9
-rw-r--r--gcc/testsuite/g++.dg/debug/using6.C22
-rw-r--r--gcc/testsuite/g++.dg/lookup/using46.C62
-rw-r--r--gcc/testsuite/g++.dg/lookup/using47.C29
-rw-r--r--gcc/testsuite/g++.dg/lookup/using48.C23
-rw-r--r--gcc/testsuite/g++.dg/lookup/using49.C20
8 files changed, 179 insertions, 0 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index c1d347d..88199d6 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,9 @@
+2011-11-18 Fabien Chêne <fabien@gcc.gnu.org>
+
+ PR c++/51141
+ * search.c (lookup_field_1): Handle USING_DECLs for the storted
+ case.
+
2011-11-18 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/51150
diff --git a/gcc/cp/search.c b/gcc/cp/search.c
index 9f308e2..3894c68 100644
--- a/gcc/cp/search.c
+++ b/gcc/cp/search.c
@@ -436,6 +436,14 @@ lookup_field_1 (tree type, tree name, bool want_type)
field = fields[i++];
while (i < hi && DECL_NAME (fields[i]) == name);
}
+
+ if (field)
+ {
+ field = strip_using_decl (field);
+ if (is_overloaded_fn (field))
+ field = NULL_TREE;
+ }
+
return field;
}
}
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index ca5740f..ce066cd 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,12 @@
+2011-11-18 Fabien Chêne <fabien@gcc.gnu.org>
+
+ PR c++/51141
+ * g++.dg/lookup/using46.C: New.
+ * g++.dg/lookup/using47.C: New.
+ * g++.dg/lookup/using48.C: New.
+ * g++.dg/lookup/using49.C: New.
+ * g++.dg/lookup/using50.C: New.
+
2011-11-18 Ulrich Weigand <Ulrich.Weigand@de.ibm.com>
* gcc.c-torture/compile/pr44707.c: Do not assume assembler
diff --git a/gcc/testsuite/g++.dg/debug/using6.C b/gcc/testsuite/g++.dg/debug/using6.C
new file mode 100644
index 0000000..8f73d37
--- /dev/null
+++ b/gcc/testsuite/g++.dg/debug/using6.C
@@ -0,0 +1,22 @@
+// PR c++/51189
+// { dg-do compile }
+
+struct A
+{
+ int i1, i2, i3, i4, i5, i6;
+};
+
+struct B : A
+{
+ using A::i1;
+ using A::i2;
+ using A::i3;
+ using A::i4;
+ using A::i5;
+ using A::i6;
+};
+
+struct C : B
+{
+ using B::i1;
+};
diff --git a/gcc/testsuite/g++.dg/lookup/using46.C b/gcc/testsuite/g++.dg/lookup/using46.C
new file mode 100644
index 0000000..6f0f5bc
--- /dev/null
+++ b/gcc/testsuite/g++.dg/lookup/using46.C
@@ -0,0 +1,62 @@
+// PR c++/51141
+// { dg-do compile }
+// { dg-options "-fpermissive -w -Werror" }
+
+typedef int size_t;
+template < size_t, size_t > struct AlignedBuffer {};
+
+template < typename > class VectorBufferBase
+{
+public:
+ allocateBuffer (size_t) {
+ }
+ buffer () {
+ }
+ *m_buffer;
+ size_t m_capacity;
+};
+
+template < typename T, size_t > class VectorBuffer:VectorBufferBase < T >
+{
+ typedef VectorBufferBase < T > Base;
+
+public:
+ VectorBuffer () {
+ }
+ allocateBuffer (size_t) {
+ m_capacity = 0;
+ }
+ Base::buffer;
+ Base::m_buffer;
+ Base::m_capacity;
+ size_t m_inlineBufferSize;
+
+ AlignedBuffer < 0, __alignof__ (T) > m_inlineBuffer;
+};
+
+template < typename T, size_t > class Vector
+{
+ typedef VectorBuffer < T,
+ 0 > Buffer;
+public:
+ void shrinkCapacity (size_t);
+
+ clear () {
+ shrinkCapacity (0);
+ }
+ Buffer m_buffer;
+};
+
+template < typename T, size_t inlineCapacity > void Vector < T,
+ inlineCapacity >::shrinkCapacity (size_t)
+{
+ m_buffer.allocateBuffer (0);
+}
+
+struct PatternDisjunction;
+struct YarrPattern {
+ reset () {
+ m_disjunctions.clear ();
+ }
+ Vector < PatternDisjunction *, 0 > m_disjunctions;
+};
diff --git a/gcc/testsuite/g++.dg/lookup/using47.C b/gcc/testsuite/g++.dg/lookup/using47.C
new file mode 100644
index 0000000..c818647
--- /dev/null
+++ b/gcc/testsuite/g++.dg/lookup/using47.C
@@ -0,0 +1,29 @@
+// PR c++/51152
+// { dg-do compile }
+
+struct A
+{
+ int a;
+};
+
+struct B
+{
+ int b1;
+ int b2;
+ A b3;
+};
+
+struct C : B
+{
+ typedef int R;
+ typedef int S;
+ typedef int T;
+ using B::b1;
+ using B::b2;
+ using B::b3;
+ void f()
+ {
+ b3.a;
+ b3.~A();
+ }
+};
diff --git a/gcc/testsuite/g++.dg/lookup/using48.C b/gcc/testsuite/g++.dg/lookup/using48.C
new file mode 100644
index 0000000..e6dc3fa
--- /dev/null
+++ b/gcc/testsuite/g++.dg/lookup/using48.C
@@ -0,0 +1,23 @@
+// PR c++/51190
+// { dg-do compile }
+
+struct A
+{
+ int i;
+};
+
+template<typename> struct B
+{
+ A* p;
+};
+
+template<typename T> struct C : B<T>
+{
+ using B<T>::p;
+
+ C() { p->i; }
+
+ int i1, i2, i3, i4, i5;
+};
+
+C<A> c;
diff --git a/gcc/testsuite/g++.dg/lookup/using49.C b/gcc/testsuite/g++.dg/lookup/using49.C
new file mode 100644
index 0000000..391476a
--- /dev/null
+++ b/gcc/testsuite/g++.dg/lookup/using49.C
@@ -0,0 +1,20 @@
+// PR c++/51188
+// { dg-do compile }
+
+#include <utility>
+class XBase {
+public:
+ virtual ~XBase() = 0;
+ enum ImpMode { Imp1, Imp2, Imp3 };
+};
+class X : public XBase {
+ class XBlock {};
+ using XBase::ImpMode;
+ using XBase::Imp3;
+ using XBase::Imp1;
+ using XBase::Imp2;
+ int _XBlocked;
+ std::pair<int,int> getImp(void) const {
+ return (std::make_pair(0, static_cast<int>(X::Imp1)));
+ }
+};