instantiate-complete.cpp revision e7450f5dbd5bed63b8ef9db86350a8fc3db011e8
1e7450f5dbd5bed63b8ef9db86350a8fc3db011e8Douglas Gregor// RUN: clang-cc -fsyntax-only -verify %s 2e7450f5dbd5bed63b8ef9db86350a8fc3db011e8Douglas Gregor 3e7450f5dbd5bed63b8ef9db86350a8fc3db011e8Douglas Gregor// Tests various places where requiring a complete type involves 4e7450f5dbd5bed63b8ef9db86350a8fc3db011e8Douglas Gregor// instantiation of that type. 5e7450f5dbd5bed63b8ef9db86350a8fc3db011e8Douglas Gregor 6e7450f5dbd5bed63b8ef9db86350a8fc3db011e8Douglas Gregortemplate<typename T> 7e7450f5dbd5bed63b8ef9db86350a8fc3db011e8Douglas Gregorstruct X { 8e7450f5dbd5bed63b8ef9db86350a8fc3db011e8Douglas Gregor X(T); 9e7450f5dbd5bed63b8ef9db86350a8fc3db011e8Douglas Gregor 10e7450f5dbd5bed63b8ef9db86350a8fc3db011e8Douglas Gregor T f; // expected-error{{data member instantiated with function type 'float (int)'}} \ 11e7450f5dbd5bed63b8ef9db86350a8fc3db011e8Douglas Gregor // expected-error{{data member instantiated with function type 'int (int)'}} \ 12e7450f5dbd5bed63b8ef9db86350a8fc3db011e8Douglas Gregor // expected-error{{data member instantiated with function type 'char (char)'}} \ 13e7450f5dbd5bed63b8ef9db86350a8fc3db011e8Douglas Gregor // expected-error{{data member instantiated with function type 'short (short)'}} \ 14e7450f5dbd5bed63b8ef9db86350a8fc3db011e8Douglas Gregor // expected-error{{data member instantiated with function type 'float (float)'}} \ 15e7450f5dbd5bed63b8ef9db86350a8fc3db011e8Douglas Gregor // expected-error{{data member instantiated with function type 'long (long)'}} 16e7450f5dbd5bed63b8ef9db86350a8fc3db011e8Douglas Gregor}; 17e7450f5dbd5bed63b8ef9db86350a8fc3db011e8Douglas Gregor 18e7450f5dbd5bed63b8ef9db86350a8fc3db011e8Douglas GregorX<int> f() { return 0; } 19e7450f5dbd5bed63b8ef9db86350a8fc3db011e8Douglas Gregor 20e7450f5dbd5bed63b8ef9db86350a8fc3db011e8Douglas Gregorstruct XField { 21e7450f5dbd5bed63b8ef9db86350a8fc3db011e8Douglas Gregor X<float(int)> xf; // expected-note{{in instantiation of template class 'struct X<float (int)>' requested here}} 22e7450f5dbd5bed63b8ef9db86350a8fc3db011e8Douglas Gregor}; 23e7450f5dbd5bed63b8ef9db86350a8fc3db011e8Douglas Gregor 24e7450f5dbd5bed63b8ef9db86350a8fc3db011e8Douglas Gregorvoid test_subscript(X<double> *ptr1, X<int(int)> *ptr2, int i) { 25e7450f5dbd5bed63b8ef9db86350a8fc3db011e8Douglas Gregor (void)ptr1[i]; 26e7450f5dbd5bed63b8ef9db86350a8fc3db011e8Douglas Gregor (void)ptr2[i]; // expected-note{{in instantiation of template class 'struct X<int (int)>' requested here}} 27e7450f5dbd5bed63b8ef9db86350a8fc3db011e8Douglas Gregor} 28e7450f5dbd5bed63b8ef9db86350a8fc3db011e8Douglas Gregor 29e7450f5dbd5bed63b8ef9db86350a8fc3db011e8Douglas Gregorvoid test_arith(X<signed char> *ptr1, X<unsigned char> *ptr2, 30e7450f5dbd5bed63b8ef9db86350a8fc3db011e8Douglas Gregor X<char(char)> *ptr3, X<short(short)> *ptr4) { 31e7450f5dbd5bed63b8ef9db86350a8fc3db011e8Douglas Gregor (void)(ptr1 + 5); 32e7450f5dbd5bed63b8ef9db86350a8fc3db011e8Douglas Gregor // FIXME: if I drop the ')' after void, below, it still parses (!) 33e7450f5dbd5bed63b8ef9db86350a8fc3db011e8Douglas Gregor (void)(5 + ptr2); 34e7450f5dbd5bed63b8ef9db86350a8fc3db011e8Douglas Gregor (void)(ptr3 + 5); // expected-note{{in instantiation of template class 'struct X<char (char)>' requested here}} 35e7450f5dbd5bed63b8ef9db86350a8fc3db011e8Douglas Gregor (void)(5 + ptr4); // expected-note{{in instantiation of template class 'struct X<short (short)>' requested here}} 36e7450f5dbd5bed63b8ef9db86350a8fc3db011e8Douglas Gregor} 37e7450f5dbd5bed63b8ef9db86350a8fc3db011e8Douglas Gregor 38e7450f5dbd5bed63b8ef9db86350a8fc3db011e8Douglas Gregorvoid test_new() { 39e7450f5dbd5bed63b8ef9db86350a8fc3db011e8Douglas Gregor (void)new X<float>(0); 40e7450f5dbd5bed63b8ef9db86350a8fc3db011e8Douglas Gregor (void)new X<float(float)>; // expected-note{{in instantiation of template class 'struct X<float (float)>' requested here}} 41e7450f5dbd5bed63b8ef9db86350a8fc3db011e8Douglas Gregor} 42e7450f5dbd5bed63b8ef9db86350a8fc3db011e8Douglas Gregor 43e7450f5dbd5bed63b8ef9db86350a8fc3db011e8Douglas Gregorvoid test_memptr(X<long> *p1, long X<long>::*pm1, 44e7450f5dbd5bed63b8ef9db86350a8fc3db011e8Douglas Gregor X<long(long)> *p2, long (X<long(long)>::*pm2)(long)) { 45e7450f5dbd5bed63b8ef9db86350a8fc3db011e8Douglas Gregor (void)(p1->*pm1); 46e7450f5dbd5bed63b8ef9db86350a8fc3db011e8Douglas Gregor (void)(p2->*pm2); // expected-note{{in instantiation of template class 'struct X<long (long)>' requested here}} 47e7450f5dbd5bed63b8ef9db86350a8fc3db011e8Douglas Gregor} 48