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