summaryrefslogtreecommitdiff
path: root/gcc/testsuite/g++.dg/lookup
diff options
context:
space:
mode:
authorLorry Tar Creator <lorry-tar-importer@baserock.org>2013-04-11 09:13:11 +0000
committer <>2014-04-23 12:05:38 +0000
commit6af3fdec2262dd94954acc5e426ef71cbd4521d3 (patch)
tree9be02de9a80f7935892a2d03741adee44723e65d /gcc/testsuite/g++.dg/lookup
parent19be2b4342ac32e9edc78ce6fed8f61b63ae98d1 (diff)
downloadgcc-tarball-6af3fdec2262dd94954acc5e426ef71cbd4521d3.tar.gz
Imported from /home/lorry/working-area/delta_gcc-tarball/gcc-4.7.3.tar.bz2.gcc-4.7.3
Diffstat (limited to 'gcc/testsuite/g++.dg/lookup')
-rw-r--r--gcc/testsuite/g++.dg/lookup/anon2.C2
-rw-r--r--gcc/testsuite/g++.dg/lookup/forscope2.C2
-rw-r--r--gcc/testsuite/g++.dg/lookup/hidden-var1.C19
-rw-r--r--gcc/testsuite/g++.dg/lookup/name-clash9.C8
-rw-r--r--gcc/testsuite/g++.dg/lookup/nested2.C6
-rw-r--r--gcc/testsuite/g++.dg/lookup/pr6936.C23
-rw-r--r--gcc/testsuite/g++.dg/lookup/scoped6.C2
-rw-r--r--gcc/testsuite/g++.dg/lookup/struct1.C4
-rw-r--r--gcc/testsuite/g++.dg/lookup/using23.C13
-rw-r--r--gcc/testsuite/g++.dg/lookup/using24.C12
-rw-r--r--gcc/testsuite/g++.dg/lookup/using25.C28
-rw-r--r--gcc/testsuite/g++.dg/lookup/using26.C27
-rw-r--r--gcc/testsuite/g++.dg/lookup/using27.C48
-rw-r--r--gcc/testsuite/g++.dg/lookup/using28.C11
-rw-r--r--gcc/testsuite/g++.dg/lookup/using29.C81
-rw-r--r--gcc/testsuite/g++.dg/lookup/using30.C8
-rw-r--r--gcc/testsuite/g++.dg/lookup/using31.C8
-rw-r--r--gcc/testsuite/g++.dg/lookup/using32.C9
-rw-r--r--gcc/testsuite/g++.dg/lookup/using33.C26
-rw-r--r--gcc/testsuite/g++.dg/lookup/using34.C10
-rw-r--r--gcc/testsuite/g++.dg/lookup/using35.C11
-rw-r--r--gcc/testsuite/g++.dg/lookup/using36.C31
-rw-r--r--gcc/testsuite/g++.dg/lookup/using37.C22
-rw-r--r--gcc/testsuite/g++.dg/lookup/using38.C23
-rw-r--r--gcc/testsuite/g++.dg/lookup/using39.C63
-rw-r--r--gcc/testsuite/g++.dg/lookup/using40.C28
-rw-r--r--gcc/testsuite/g++.dg/lookup/using41.C21
-rw-r--r--gcc/testsuite/g++.dg/lookup/using42.C26
-rw-r--r--gcc/testsuite/g++.dg/lookup/using44.C28
-rw-r--r--gcc/testsuite/g++.dg/lookup/using45.C33
-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
-rw-r--r--gcc/testsuite/g++.dg/lookup/using50.C15
-rw-r--r--gcc/testsuite/g++.dg/lookup/using51.C18
-rw-r--r--gcc/testsuite/g++.dg/lookup/using52.C16
-rw-r--r--gcc/testsuite/g++.dg/lookup/using7.C2
38 files changed, 813 insertions, 5 deletions
diff --git a/gcc/testsuite/g++.dg/lookup/anon2.C b/gcc/testsuite/g++.dg/lookup/anon2.C
index d556ba0034..4984307e45 100644
--- a/gcc/testsuite/g++.dg/lookup/anon2.C
+++ b/gcc/testsuite/g++.dg/lookup/anon2.C
@@ -1,5 +1,5 @@
// { dg-do compile }
-// { dg-options "" }
+// { dg-options "-std=c++98" }
// Make sure we issue a diagnostic if a type with no linkage is used
// to declare a a variable that has linkage.
diff --git a/gcc/testsuite/g++.dg/lookup/forscope2.C b/gcc/testsuite/g++.dg/lookup/forscope2.C
index 1fed957a04..882f102a7f 100644
--- a/gcc/testsuite/g++.dg/lookup/forscope2.C
+++ b/gcc/testsuite/g++.dg/lookup/forscope2.C
@@ -7,3 +7,5 @@ struct S {
}
};
+// It's OK to error or not on line 6.
+// { dg-prune-output ":6:" }
diff --git a/gcc/testsuite/g++.dg/lookup/hidden-var1.C b/gcc/testsuite/g++.dg/lookup/hidden-var1.C
new file mode 100644
index 0000000000..6be32b581b
--- /dev/null
+++ b/gcc/testsuite/g++.dg/lookup/hidden-var1.C
@@ -0,0 +1,19 @@
+// Origin PR c++/45625
+// { dg-do compile }
+
+struct Outer
+{
+ static const int value = 1 ;
+
+ template< int value >
+ struct Inner
+ {
+ static const int*
+ get_value()
+ {
+ return &value ;// { dg-error "lvalue required" }
+ }
+ };
+};
+
+template class Outer::Inner<2>;
diff --git a/gcc/testsuite/g++.dg/lookup/name-clash9.C b/gcc/testsuite/g++.dg/lookup/name-clash9.C
new file mode 100644
index 0000000000..1e04fafd5b
--- /dev/null
+++ b/gcc/testsuite/g++.dg/lookup/name-clash9.C
@@ -0,0 +1,8 @@
+// { dg-do compile }
+// PR c++/48010
+
+struct A
+{
+ struct type {}; // { dg-message "previous" }
+ typedef int type; // { dg-error "conflicts" }
+};
diff --git a/gcc/testsuite/g++.dg/lookup/nested2.C b/gcc/testsuite/g++.dg/lookup/nested2.C
new file mode 100644
index 0000000000..361a0c75d5
--- /dev/null
+++ b/gcc/testsuite/g++.dg/lookup/nested2.C
@@ -0,0 +1,6 @@
+// PR c++/51586
+
+union U
+{
+ union U { int i; }; // { dg-error "same name" }
+};
diff --git a/gcc/testsuite/g++.dg/lookup/pr6936.C b/gcc/testsuite/g++.dg/lookup/pr6936.C
new file mode 100644
index 0000000000..377fbcce1e
--- /dev/null
+++ b/gcc/testsuite/g++.dg/lookup/pr6936.C
@@ -0,0 +1,23 @@
+// { dg-do compile }
+// PR c++/6936
+
+struct Baser
+{
+ enum { j, i }; // { dg-error "inaccessible" }
+};
+
+struct Base : Baser
+{
+ static void j();
+ static void i();
+};
+
+struct Derv : Base
+{
+ using Baser::j;
+private:
+ using Baser::i;
+};
+
+int k = Derv::j;
+int l = Derv::i; // { dg-error "context" }
diff --git a/gcc/testsuite/g++.dg/lookup/scoped6.C b/gcc/testsuite/g++.dg/lookup/scoped6.C
index b83b08fe94..51393961ab 100644
--- a/gcc/testsuite/g++.dg/lookup/scoped6.C
+++ b/gcc/testsuite/g++.dg/lookup/scoped6.C
@@ -10,7 +10,7 @@ public:
class Bar {
Foo<int> foo_;
public:
- Bar() {} // { dg-message "instantiated" }
+ Bar() {} // { dg-message "required" }
};
template class Foo<int>;
diff --git a/gcc/testsuite/g++.dg/lookup/struct1.C b/gcc/testsuite/g++.dg/lookup/struct1.C
index f4b83ecf6b..7c1e38c186 100644
--- a/gcc/testsuite/g++.dg/lookup/struct1.C
+++ b/gcc/testsuite/g++.dg/lookup/struct1.C
@@ -2,10 +2,10 @@
// the definition of C.
struct A;
-typedef struct A B; // { dg-error "previous declaration" }
+typedef struct A B; // { dg-message "previous declaration" }
struct B; // { dg-error "using typedef-name" }
-typedef struct { int i; } C; // { dg-error "previous declaration" }
+typedef struct { int i; } C; // { dg-message "previous declaration" }
struct C; // { dg-error "using typedef-name" }
struct D;
diff --git a/gcc/testsuite/g++.dg/lookup/using23.C b/gcc/testsuite/g++.dg/lookup/using23.C
new file mode 100644
index 0000000000..5dd8d8594b
--- /dev/null
+++ b/gcc/testsuite/g++.dg/lookup/using23.C
@@ -0,0 +1,13 @@
+// PR c++/50742
+
+typedef int A;
+
+void f(int i)
+{
+ switch (i)
+ {
+ case 0:
+ using ::A;
+ default:;
+ }
+}
diff --git a/gcc/testsuite/g++.dg/lookup/using24.C b/gcc/testsuite/g++.dg/lookup/using24.C
new file mode 100644
index 0000000000..4413be1f03
--- /dev/null
+++ b/gcc/testsuite/g++.dg/lookup/using24.C
@@ -0,0 +1,12 @@
+// PR c++/26256
+// { dg-do compile }
+
+struct A { int next; };
+struct B { int next; };
+struct C : B { using B::next; };
+
+struct D : A, C
+{
+ using C::next;
+ void f() { next = 1; }
+};
diff --git a/gcc/testsuite/g++.dg/lookup/using25.C b/gcc/testsuite/g++.dg/lookup/using25.C
new file mode 100644
index 0000000000..eb605700d8
--- /dev/null
+++ b/gcc/testsuite/g++.dg/lookup/using25.C
@@ -0,0 +1,28 @@
+// PR c++/26256
+// { dg-do run }
+
+struct A
+{
+ int next;
+};
+
+struct B
+{
+ int next;
+};
+
+struct C : public A, public B
+{
+ using A::next;
+};
+
+void foo(C& c) { c.next = 42; }
+
+int main()
+{
+ C c;
+ foo (c);
+ c.B::next = 12;
+ if (c.next != 42 || c.A::next != 42 || c.B::next != 12)
+ __builtin_abort();
+}
diff --git a/gcc/testsuite/g++.dg/lookup/using26.C b/gcc/testsuite/g++.dg/lookup/using26.C
new file mode 100644
index 0000000000..141d14581c
--- /dev/null
+++ b/gcc/testsuite/g++.dg/lookup/using26.C
@@ -0,0 +1,27 @@
+// PR c++/26256
+// { dg-do compile }
+
+struct A
+{
+ double next;
+};
+
+struct B
+{
+private:
+ int next; // { dg-error "private" }
+};
+
+struct C
+{
+ int next;
+};
+
+struct D : A, B, C // { dg-error "context" }
+{
+ using B::next;
+ void f()
+ {
+ next = 12;
+ }
+};
diff --git a/gcc/testsuite/g++.dg/lookup/using27.C b/gcc/testsuite/g++.dg/lookup/using27.C
new file mode 100644
index 0000000000..c94cf6ea1a
--- /dev/null
+++ b/gcc/testsuite/g++.dg/lookup/using27.C
@@ -0,0 +1,48 @@
+// PR c++/26256
+// { dg-do run }
+
+struct A
+{
+ typedef int type;
+};
+
+struct B
+{
+ typedef double type;
+};
+
+struct C : A, B
+{
+ using A::type;
+ type d;
+
+ void f()
+ {
+ type e;
+ if (sizeof (type) != sizeof (A::type))
+ __builtin_abort();
+ }
+
+ void g();
+};
+
+void C::g()
+{
+ type x;
+ if (sizeof (type) != sizeof (A::type))
+ __builtin_abort();
+}
+
+int main ()
+{
+ if (sizeof (C::type) != sizeof (A::type))
+ __builtin_abort();
+
+ if (sizeof (C::d) != sizeof (A::type))
+ __builtin_abort();
+
+ C::type x;
+ C c;
+ c.f();
+ c.g();
+}
diff --git a/gcc/testsuite/g++.dg/lookup/using28.C b/gcc/testsuite/g++.dg/lookup/using28.C
new file mode 100644
index 0000000000..ae4067a23e
--- /dev/null
+++ b/gcc/testsuite/g++.dg/lookup/using28.C
@@ -0,0 +1,11 @@
+// PR c++/26256
+// { dg-do compile }
+
+struct A { int f; };
+struct B { int f; };
+struct C : A, B { using B::f; };
+
+struct D : C
+{
+ void g() { f = 1; }
+};
diff --git a/gcc/testsuite/g++.dg/lookup/using29.C b/gcc/testsuite/g++.dg/lookup/using29.C
new file mode 100644
index 0000000000..428021cf77
--- /dev/null
+++ b/gcc/testsuite/g++.dg/lookup/using29.C
@@ -0,0 +1,81 @@
+// { dg-do compile }
+
+struct A
+{
+ int i;
+};
+
+struct B
+{
+ int i;
+};
+
+struct C : A, B
+{
+ using A::i; // { dg-message "previous" }
+ using B::i; // { dg-error "redeclaration" }
+};
+
+struct E
+{
+ typedef int type;
+};
+
+struct F
+{
+ typedef int type;
+};
+
+struct G : E, F
+{
+ using E::type; // { dg-message "previous" }
+ using F::type; // { dg-error "redeclaration" }
+};
+
+struct H
+{
+ typedef int type;
+};
+
+struct I : H
+{
+ typedef int type; // { dg-message "previous" }
+ using H::type; // { dg-error "conflicts" }
+};
+
+struct I2 : H
+{
+ using H::type; // { dg-message "previous" }
+ typedef int type; // { dg-error "conflicts" }
+};
+
+struct J
+{
+ struct type {};
+};
+
+struct K : J
+{
+ struct type {}; // { dg-message "previous" }
+ using J::type; // { dg-error "conflicts" }
+};
+
+struct L : J
+{
+ using J::type; // { dg-message "previous" }
+ struct type {}; // { dg-error "conflicts" }
+};
+
+struct M
+{
+ typedef int type;
+ struct type2 {};
+};
+
+struct N : M
+{
+ using M::type; // { dg-message "previous" }
+ using M::type; // { dg-error "redeclaration" }
+ using M::type2; // { dg-message "previous" }
+ using M::type2; // { dg-error "redeclaration" }
+};
diff --git a/gcc/testsuite/g++.dg/lookup/using30.C b/gcc/testsuite/g++.dg/lookup/using30.C
new file mode 100644
index 0000000000..3fbe96c3ce
--- /dev/null
+++ b/gcc/testsuite/g++.dg/lookup/using30.C
@@ -0,0 +1,8 @@
+// { dg-do compile }
+
+struct H { typedef int type; };
+struct J : H
+{
+ struct type {}; // { dg-message "previous" }
+ using H::type; // { dg-error "conflicts" }
+};
diff --git a/gcc/testsuite/g++.dg/lookup/using31.C b/gcc/testsuite/g++.dg/lookup/using31.C
new file mode 100644
index 0000000000..3b1f6e90e1
--- /dev/null
+++ b/gcc/testsuite/g++.dg/lookup/using31.C
@@ -0,0 +1,8 @@
+// { dg-do compile }
+
+struct H2 { int f (); };
+struct J2 : H2
+{
+ struct f {};
+ using H2::f;
+};
diff --git a/gcc/testsuite/g++.dg/lookup/using32.C b/gcc/testsuite/g++.dg/lookup/using32.C
new file mode 100644
index 0000000000..cc0e96ca6b
--- /dev/null
+++ b/gcc/testsuite/g++.dg/lookup/using32.C
@@ -0,0 +1,9 @@
+// { dg-do compile }
+
+struct T { struct type {}; };
+struct T2 : T { using T::type; };
+struct T3 : T2
+{
+ struct type {};
+ type t;
+};
diff --git a/gcc/testsuite/g++.dg/lookup/using33.C b/gcc/testsuite/g++.dg/lookup/using33.C
new file mode 100644
index 0000000000..a80be03644
--- /dev/null
+++ b/gcc/testsuite/g++.dg/lookup/using33.C
@@ -0,0 +1,26 @@
+// { dg-do run }
+
+template <class T>
+struct Foo
+{
+ int k (float) {return 0;}
+};
+
+template <class T>
+struct Baz
+{
+ int k (int) {return 1;}
+};
+
+template <class T>
+struct Bar : Foo<T> , Baz<T>
+{
+ using Foo<T>::k;
+ using Baz<T>::k;
+};
+
+int main()
+{
+ Bar<int> bar;
+ return bar.k( 1.0f );
+}
diff --git a/gcc/testsuite/g++.dg/lookup/using34.C b/gcc/testsuite/g++.dg/lookup/using34.C
new file mode 100644
index 0000000000..79c019d021
--- /dev/null
+++ b/gcc/testsuite/g++.dg/lookup/using34.C
@@ -0,0 +1,10 @@
+// { dg-do compile }
+
+struct A { int f (); };
+struct B : A
+{
+ using A::f;
+ struct f {};
+ void g() { f(); struct f ff; }
+ struct f ff;
+};
diff --git a/gcc/testsuite/g++.dg/lookup/using35.C b/gcc/testsuite/g++.dg/lookup/using35.C
new file mode 100644
index 0000000000..e7e82741d6
--- /dev/null
+++ b/gcc/testsuite/g++.dg/lookup/using35.C
@@ -0,0 +1,11 @@
+// { dg-do compile }
+
+struct A { typedef int type; };
+struct B { typedef int type; };
+struct C : B { using B::type; };
+
+struct D : A, C
+{
+ using C::type;
+ void f() { type t = 0;}
+};
diff --git a/gcc/testsuite/g++.dg/lookup/using36.C b/gcc/testsuite/g++.dg/lookup/using36.C
new file mode 100644
index 0000000000..966c60b896
--- /dev/null
+++ b/gcc/testsuite/g++.dg/lookup/using36.C
@@ -0,0 +1,31 @@
+// PR c++/25994
+// { dg-do run }
+
+struct B1
+{
+ void f (char) {}
+ void f (double) { __builtin_abort(); }
+};
+
+struct B2
+{
+ void f (double) { __builtin_abort(); }
+ void f (int) {}
+};
+
+struct D : public B1, public B2
+{
+ using B1::f;
+ using B2::f;
+ void g ()
+ {
+ f ('a'); // should call B1::f(char)
+ f (33); // should call B2::f(int)
+ }
+};
+
+int main()
+{
+ D d;
+ d.g();
+}
diff --git a/gcc/testsuite/g++.dg/lookup/using37.C b/gcc/testsuite/g++.dg/lookup/using37.C
new file mode 100644
index 0000000000..a71206e89f
--- /dev/null
+++ b/gcc/testsuite/g++.dg/lookup/using37.C
@@ -0,0 +1,22 @@
+// PR c++/30195
+// { dg-do run }
+
+template<class T> struct B
+{
+ void foo(T) {}
+};
+
+template<class T>
+struct D : B<int>, B<double>
+{
+ using B<int>::foo;
+ using B<double>::foo;
+ void bar() { foo(3); }
+};
+
+int main()
+{
+ D<int> x;
+ x.bar();
+ return 0;
+}
diff --git a/gcc/testsuite/g++.dg/lookup/using38.C b/gcc/testsuite/g++.dg/lookup/using38.C
new file mode 100644
index 0000000000..377fbcce1e
--- /dev/null
+++ b/gcc/testsuite/g++.dg/lookup/using38.C
@@ -0,0 +1,23 @@
+// { dg-do compile }
+// PR c++/6936
+
+struct Baser
+{
+ enum { j, i }; // { dg-error "inaccessible" }
+};
+
+struct Base : Baser
+{
+ static void j();
+ static void i();
+};
+
+struct Derv : Base
+{
+ using Baser::j;
+private:
+ using Baser::i;
+};
+
+int k = Derv::j;
+int l = Derv::i; // { dg-error "context" }
diff --git a/gcc/testsuite/g++.dg/lookup/using39.C b/gcc/testsuite/g++.dg/lookup/using39.C
new file mode 100644
index 0000000000..56ae89a4a2
--- /dev/null
+++ b/gcc/testsuite/g++.dg/lookup/using39.C
@@ -0,0 +1,63 @@
+// { dg-do run }
+
+template <class T>
+struct A
+{
+ int f() { return 1; }
+};
+
+template <class T>
+struct B : A<T>
+{
+ int f() { return 2; }
+
+ using A<T>::f;
+ void g()
+ {
+ if (A<T>::f() != 1 )
+ __builtin_abort();
+
+ if( B<T>::f() != 2 )
+ __builtin_abort();
+
+ if( this->f() != 2 )
+ __builtin_abort();
+ }
+};
+
+template <class T>
+struct C
+{
+ int h( int i ) { return 1; }
+ int h( double d ) { return 2; }
+};
+
+template <class T>
+struct D : private C<T>
+{
+ using C<T>::h;
+ int h( char c ) { return 0; }
+ int h() { return 3; }
+};
+
+int main()
+{
+ B<int> b;
+ b.g();
+ b.f();
+ b.A<int>::f();
+ b.B<int>::f();
+
+ D<int> d;
+ if( d.h( 'a' ) != 0 )
+ __builtin_abort();
+
+ if( d.h( 3 ) != 1 )
+ __builtin_abort();
+
+ if( d.h( 3.14 ) != 2 )
+ __builtin_abort();
+
+ if( d.h() != 3 )
+ __builtin_abort();
+}
diff --git a/gcc/testsuite/g++.dg/lookup/using40.C b/gcc/testsuite/g++.dg/lookup/using40.C
new file mode 100644
index 0000000000..1bcdd0dbf5
--- /dev/null
+++ b/gcc/testsuite/g++.dg/lookup/using40.C
@@ -0,0 +1,28 @@
+// { dg-do compile }
+
+struct Base
+{
+ void f();
+ typedef int type;
+ struct Type {};
+ int i;
+ static int j;
+};
+
+struct A : Base
+{
+ using Base::f; // { dg-message "previous declaration" }
+ using Base::f; // { dg-error "redeclaration" }
+
+ using Base::type; // { dg-message "previous declaration" }
+ using Base::type; // { dg-error "redeclaration" }
+
+ using Base::Type; // { dg-message "previous declaration" }
+ using Base::Type; // { dg-error "redeclaration" }
+
+ using Base::i; // { dg-message "previous declaration" }
+ using Base::i; // { dg-error "redeclaration" }
+
+ using Base::j; // { dg-message "previous declaration" }
+ using Base::j; // { dg-error "redeclaration" }
+};
diff --git a/gcc/testsuite/g++.dg/lookup/using41.C b/gcc/testsuite/g++.dg/lookup/using41.C
new file mode 100644
index 0000000000..dcc618ba56
--- /dev/null
+++ b/gcc/testsuite/g++.dg/lookup/using41.C
@@ -0,0 +1,21 @@
+// { dg-do compile }
+
+template <class T>
+struct Base
+{
+ void f();
+};
+
+template <class T>
+struct A : Base<T>
+{
+ using Base<T>::f; // { dg-message "previous declaration" }
+ using Base<T>::f; // { dg-error "redeclaration" }
+};
+
+template <class T, class U>
+struct B : Base<T>, Base<U>
+{
+ using Base<T>::f;
+ using Base<U>::f;
+};
diff --git a/gcc/testsuite/g++.dg/lookup/using42.C b/gcc/testsuite/g++.dg/lookup/using42.C
new file mode 100644
index 0000000000..bca65acc74
--- /dev/null
+++ b/gcc/testsuite/g++.dg/lookup/using42.C
@@ -0,0 +1,26 @@
+// PR c++/30195
+// { dg-do run }
+
+template <class T>
+struct B
+{
+ void foo(T) {}
+};
+
+template<class T>
+struct Out
+{
+ struct D : B<T>, B<double>
+ {
+ using B<T>::foo;
+ using B<double>::foo;
+ void bar() { foo(3); }
+ };
+};
+
+int main()
+{
+ Out<int>::D x;
+ x.bar();
+ return 0;
+}
diff --git a/gcc/testsuite/g++.dg/lookup/using44.C b/gcc/testsuite/g++.dg/lookup/using44.C
new file mode 100644
index 0000000000..d754befd0a
--- /dev/null
+++ b/gcc/testsuite/g++.dg/lookup/using44.C
@@ -0,0 +1,28 @@
+// PR c++/30195
+// { dg-do run }
+
+template <class T>
+struct B
+{
+ void foo(char) { __builtin_abort(); }
+ void foo(short) { __builtin_abort(); }
+ void foo(T) {}
+};
+
+template<class T>
+struct Out
+{
+ struct D : B<T>, B<double>
+ {
+ using B<T>::foo;
+ using B<double>::foo;
+ void bar() { foo(3); }
+ };
+};
+
+int main()
+{
+ Out<int>::D x;
+ x.bar();
+ return 0;
+}
diff --git a/gcc/testsuite/g++.dg/lookup/using45.C b/gcc/testsuite/g++.dg/lookup/using45.C
new file mode 100644
index 0000000000..c92b794d9c
--- /dev/null
+++ b/gcc/testsuite/g++.dg/lookup/using45.C
@@ -0,0 +1,33 @@
+// PR c++/30195
+// { dg-do run }
+
+template <class T>
+struct A
+{
+ int f(int) { return 0; }
+ int f(double) { return 1; }
+ int f(char) { return 2; }
+};
+
+template <class T>
+struct B : A<T>
+{
+ using A<T>::f;
+ int f(int) { return 3; }
+};
+
+int main()
+{
+ B<int> b;
+ if( b.f( 42 ) != 3 )
+ __builtin_abort();
+
+ if( b.f( 3.14 ) != 1 )
+ __builtin_abort();
+
+ if( b.f( 'a' ) != 2 )
+ __builtin_abort();
+
+ if( b.A<int>::f( 42 ) != 0 )
+ __builtin_abort();
+}
diff --git a/gcc/testsuite/g++.dg/lookup/using46.C b/gcc/testsuite/g++.dg/lookup/using46.C
new file mode 100644
index 0000000000..6f0f5bca09
--- /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 0000000000..c81864705c
--- /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 0000000000..e6dc3fab77
--- /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 0000000000..391476ac47
--- /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)));
+ }
+};
diff --git a/gcc/testsuite/g++.dg/lookup/using50.C b/gcc/testsuite/g++.dg/lookup/using50.C
new file mode 100644
index 0000000000..d525a472b6
--- /dev/null
+++ b/gcc/testsuite/g++.dg/lookup/using50.C
@@ -0,0 +1,15 @@
+// PR c++/51319
+// { dg-do compile }
+
+template<int> struct X {};
+
+struct Base
+{
+ enum { a = 1 };
+};
+
+struct Der : Base
+{
+ using Base::a;
+ typedef X<(int)a> Y;
+};
diff --git a/gcc/testsuite/g++.dg/lookup/using51.C b/gcc/testsuite/g++.dg/lookup/using51.C
new file mode 100644
index 0000000000..8e3e56b056
--- /dev/null
+++ b/gcc/testsuite/g++.dg/lookup/using51.C
@@ -0,0 +1,18 @@
+// PR c++/51382
+// { dg-do compile }
+// { dg-options "-Wno-deprecated" }
+
+template< int Value >
+struct Base
+{
+ enum { b_e = Value };
+};
+
+template< typename Type >
+struct Derived : Type
+{
+ Type::b_e;
+ enum { d_e = b_e };
+};
+
+int v = (int)Derived< Base< 3 > >::d_e;
diff --git a/gcc/testsuite/g++.dg/lookup/using52.C b/gcc/testsuite/g++.dg/lookup/using52.C
new file mode 100644
index 0000000000..bf2620714e
--- /dev/null
+++ b/gcc/testsuite/g++.dg/lookup/using52.C
@@ -0,0 +1,16 @@
+// { dg-do compile }
+// PR c++/52645
+
+class A
+{
+protected:
+ struct B {};
+};
+
+class C : A
+{
+protected:
+ using A::B;
+
+ struct D : public B {};
+};
diff --git a/gcc/testsuite/g++.dg/lookup/using7.C b/gcc/testsuite/g++.dg/lookup/using7.C
index 69e27da470..0c75a2df6b 100644
--- a/gcc/testsuite/g++.dg/lookup/using7.C
+++ b/gcc/testsuite/g++.dg/lookup/using7.C
@@ -9,4 +9,4 @@ template <typename T> struct B : A<T> // { dg-error "incomplete" }
// { dg-error "using" "using" { target *-*-* } 8 }
};
-B<void> b; // { dg-message "instantiated" }
+B<void> b; // { dg-message "required" }