diff options
Diffstat (limited to 'gcc/testsuite/g++.dg/lookup')
28 files changed, 715 insertions, 4 deletions
diff --git a/gcc/testsuite/g++.dg/lookup/name-clash9.C b/gcc/testsuite/g++.dg/lookup/name-clash9.C index 4167f47b4a9..1e04fafd5b9 100644 --- a/gcc/testsuite/g++.dg/lookup/name-clash9.C +++ b/gcc/testsuite/g++.dg/lookup/name-clash9.C @@ -3,6 +3,6 @@ struct A { - struct type {}; // { dg-error "conflicts with previous" } - typedef int type; // { dg-error "declaration" } + struct type {}; // { dg-message "previous" } + typedef int type; // { dg-error "conflicts" } }; diff --git a/gcc/testsuite/g++.dg/lookup/pr6936.C b/gcc/testsuite/g++.dg/lookup/pr6936.C new file mode 100644 index 00000000000..377fbcce1e3 --- /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/struct1.C b/gcc/testsuite/g++.dg/lookup/struct1.C index f4b83ecf6b8..7c1e38c1863 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/using24.C b/gcc/testsuite/g++.dg/lookup/using24.C new file mode 100644 index 00000000000..4413be1f032 --- /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 00000000000..eb605700d8d --- /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 00000000000..141d14581c1 --- /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 00000000000..c94cf6ea1a5 --- /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 00000000000..ae4067a23ea --- /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 00000000000..428021cf778 --- /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 00000000000..3fbe96c3ce8 --- /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 00000000000..3b1f6e90e10 --- /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 00000000000..cc0e96ca6b1 --- /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 00000000000..a80be036442 --- /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 00000000000..79c019d0216 --- /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 00000000000..e7e82741d64 --- /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 00000000000..966c60b8961 --- /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 00000000000..a71206e89f7 --- /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 00000000000..377fbcce1e3 --- /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 00000000000..56ae89a4a22 --- /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 00000000000..1bcdd0dbf5e --- /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 00000000000..dcc618ba568 --- /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 00000000000..bca65acc74f --- /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 00000000000..d754befd0a4 --- /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 00000000000..c92b794d9c5 --- /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 00000000000..6f0f5bca090 --- /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 00000000000..c81864705c4 --- /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 00000000000..e6dc3fab77c --- /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 00000000000..391476ac472 --- /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))); + } +}; |