Douglas Gregor | de650ae | 2009-03-31 18:38:02 +0000 | [diff] [blame^] | 1 | // RUN: clang-cc -fsyntax-only -verify %s |
Douglas Gregor | c45c232 | 2009-03-31 00:43:58 +0000 | [diff] [blame] | 2 | |
| 3 | struct add_pointer { |
| 4 | template<typename T> |
| 5 | struct apply { |
| 6 | typedef T* type; |
| 7 | }; |
| 8 | }; |
| 9 | |
| 10 | struct add_reference { |
| 11 | template<typename T> |
| 12 | struct apply { |
Douglas Gregor | de650ae | 2009-03-31 18:38:02 +0000 | [diff] [blame^] | 13 | typedef T& type; // expected-error{{cannot form a reference to 'void'}} |
Douglas Gregor | c45c232 | 2009-03-31 00:43:58 +0000 | [diff] [blame] | 14 | }; |
| 15 | }; |
| 16 | |
| 17 | template<typename MetaFun, typename T> |
| 18 | struct apply1 { |
Douglas Gregor | de650ae | 2009-03-31 18:38:02 +0000 | [diff] [blame^] | 19 | typedef typename MetaFun::template apply<T>::type type; // expected-note{{in instantiation of template class 'struct add_reference::apply<void>' requested here}} |
Douglas Gregor | c45c232 | 2009-03-31 00:43:58 +0000 | [diff] [blame] | 20 | }; |
| 21 | |
Douglas Gregor | c45c232 | 2009-03-31 00:43:58 +0000 | [diff] [blame] | 22 | int i; |
Douglas Gregor | c45c232 | 2009-03-31 00:43:58 +0000 | [diff] [blame] | 23 | apply1<add_pointer, int>::type ip = &i; |
| 24 | apply1<add_reference, int>::type ir = i; |
Douglas Gregor | de650ae | 2009-03-31 18:38:02 +0000 | [diff] [blame^] | 25 | apply1<add_reference, float>::type fr = i; // expected-error{{non-const lvalue reference to type 'float' cannot be initialized with a value of type 'int'}} |
| 26 | |
| 27 | void test() { |
| 28 | apply1<add_reference, void>::type t; // expected-note{{in instantiation of template class 'struct apply1<struct add_reference, void>' requested here}} \ |
| 29 | // FIXME: expected-error{{unexpected type name 'type': expected expression}} |
| 30 | } |