1ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao// RUN: %clang_cc1 -fsyntax-only -verify %s 2ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 3ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaostruct add_pointer { 4ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao template<typename T> 5ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao struct apply { 6ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao typedef T* type; 7ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao }; 8ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao}; 9ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 10ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaostruct add_reference { 11ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao template<typename T> 12ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao struct apply { 13ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao typedef T& type; // expected-error{{cannot form a reference to 'void'}} 14ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao }; 15ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao}; 16ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 17ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaostruct bogus { 18ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao struct apply { 19ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao typedef int type; 20ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao }; 21ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao}; 22ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 23ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaotemplate<typename MetaFun, typename T> 24ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaostruct apply1 { 25ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao typedef typename MetaFun::template apply<T>::type type; // expected-note{{in instantiation of template class 'add_reference::apply<void>' requested here}} \ 26ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao // expected-error{{'apply' following the 'template' keyword does not refer to a template}} 27ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao}; 28ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 29ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoint i; 30ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoapply1<add_pointer, int>::type ip = &i; 31ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoapply1<add_reference, int>::type ir = i; 32ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoapply1<add_reference, float>::type fr = i; // expected-error{{non-const lvalue reference to type 'float' cannot bind to a value of unrelated type 'int'}} 33ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 34ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaovoid test() { 35ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao apply1<add_reference, void>::type t; // expected-note{{in instantiation of template class 'apply1<add_reference, void>' requested here}} 36ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 37ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao apply1<bogus, int>::type t2; // expected-note{{in instantiation of template class 'apply1<bogus, int>' requested here}} 38ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao} 39ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 40ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 41