diff options
Diffstat (limited to 'gcc/testsuite/g++.dg/lookup')
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" } |