diff options
Diffstat (limited to 'gcc/testsuite/g++.old-deja/g++.jason/template36.C')
-rw-r--r-- | gcc/testsuite/g++.old-deja/g++.jason/template36.C | 57 |
1 files changed, 57 insertions, 0 deletions
diff --git a/gcc/testsuite/g++.old-deja/g++.jason/template36.C b/gcc/testsuite/g++.old-deja/g++.jason/template36.C new file mode 100644 index 000000000..23cdb00e6 --- /dev/null +++ b/gcc/testsuite/g++.old-deja/g++.jason/template36.C @@ -0,0 +1,57 @@ +// { dg-do run } +// Testcase for implicit 'typename' and resolution of 'typename's in the +// current scope. + +class base1 { +public: + int bar() const + { return 1; } +}; + +class base2 { +public: + int bar() const + { return 0; } +}; + +template<class X> +struct base_trait { + typedef base1 base; +}; + +template<> +struct base_trait<float> { + typedef base2 base; +}; + +template<class T> +class weird : public base_trait<T>::base { +public: + typedef typename base_trait<T>::base base; + + base f (); + int base::* g (); + + int zowee() const + { return this->bar(); } +}; + +template <class T> +typename weird<T>::base weird<T>::f () +{ + return base(); +} + +// The standard does not allow this case; the `typename' keyword may +// not appear in a ptr-operator. +#if 0 +template <class T> +int typename weird<T>::base::* weird<T>::g () +{ return 0; } +#endif + +int main() +{ + weird<float> z; + return z.zowee() || z.f().bar(); +} |