1b4e715beeb670b30a8d1237085e3379fe28afb0fDouglas Gregor// Test this without pch.
2a5728872c7702ddd09537c95bc3cbd20e1f2fb09Daniel Dunbar// RUN: %clang_cc1 -fblocks -include %S/types.h -fsyntax-only -verify %s
3b4e715beeb670b30a8d1237085e3379fe28afb0fDouglas Gregor
4b4e715beeb670b30a8d1237085e3379fe28afb0fDouglas Gregor// Test with pch.
5a5728872c7702ddd09537c95bc3cbd20e1f2fb09Daniel Dunbar// RUN: %clang_cc1 -emit-pch -fblocks -o %t %S/types.h
6400f5125e2432d648f2c8a31b36a7f318a880c47Argyrios Kyrtzidis// RUN: %clang_cc1 -fblocks -include-pch %t -fsyntax-only -verify %s -ast-print
7b4e715beeb670b30a8d1237085e3379fe28afb0fDouglas Gregor
86d473967121ac70ecede83bb2b47247e9a3766f3Douglas Gregortypedef int INT;
96d473967121ac70ecede83bb2b47247e9a3766f3Douglas GregorINT int_value;
106d473967121ac70ecede83bb2b47247e9a3766f3Douglas Gregor
116d473967121ac70ecede83bb2b47247e9a3766f3Douglas Gregor__attribute__((address_space(1))) int int_as_one;
126d473967121ac70ecede83bb2b47247e9a3766f3Douglas Gregor
136d473967121ac70ecede83bb2b47247e9a3766f3Douglas Gregor// TYPE_EXT_QUAL
1486c05f3f28bcf07c97dfb1881686fc43be2f47c2John McCallASInt *as_int_ptr1 = &int_value;  // expected-error{{changes address space of pointer}}
156d473967121ac70ecede83bb2b47247e9a3766f3Douglas GregorASInt *as_int_ptr2 = &int_as_one;
166d473967121ac70ecede83bb2b47247e9a3766f3Douglas Gregor
17b4e715beeb670b30a8d1237085e3379fe28afb0fDouglas Gregor// TYPE_COMPLEX
18b4e715beeb670b30a8d1237085e3379fe28afb0fDouglas Gregor_Complex float Cfloat_val;
19b4e715beeb670b30a8d1237085e3379fe28afb0fDouglas GregorCfloat *Cfloat_ptr = &Cfloat_val;
20b4e715beeb670b30a8d1237085e3379fe28afb0fDouglas Gregor
21dbc68bd28d5868f3b1b5179add40b33cec7bea07Eli Friedman// TYPE_ATOMIC
22dbc68bd28d5868f3b1b5179add40b33cec7bea07Eli Friedman_Atomic(int) AtomicInt_val;
23dbc68bd28d5868f3b1b5179add40b33cec7bea07Eli FriedmanAtomicInt *AtomicInt_ptr = &AtomicInt_val;
24dbc68bd28d5868f3b1b5179add40b33cec7bea07Eli Friedman
25b4e715beeb670b30a8d1237085e3379fe28afb0fDouglas Gregor// TYPE_POINTER
26b4e715beeb670b30a8d1237085e3379fe28afb0fDouglas Gregorint_ptr int_value_ptr = &int_value;
27b4e715beeb670b30a8d1237085e3379fe28afb0fDouglas Gregor
28b4e715beeb670b30a8d1237085e3379fe28afb0fDouglas Gregor// TYPE_BLOCK_POINTER
29b4e715beeb670b30a8d1237085e3379fe28afb0fDouglas Gregorvoid test_block_ptr(Block *bl) {
30b4e715beeb670b30a8d1237085e3379fe28afb0fDouglas Gregor  *bl = ^(int x, float f) { return x; };
31b4e715beeb670b30a8d1237085e3379fe28afb0fDouglas Gregor}
32b4e715beeb670b30a8d1237085e3379fe28afb0fDouglas Gregor
33b4e715beeb670b30a8d1237085e3379fe28afb0fDouglas Gregor// TYPE_CONSTANT_ARRAY
34b4e715beeb670b30a8d1237085e3379fe28afb0fDouglas Gregorfive_ints fvi = { 1, 2, 3, 4, 5 };
35b4e715beeb670b30a8d1237085e3379fe28afb0fDouglas Gregor
36b4e715beeb670b30a8d1237085e3379fe28afb0fDouglas Gregor// TYPE_INCOMPLETE_ARRAY
37b4e715beeb670b30a8d1237085e3379fe28afb0fDouglas Gregorfloat_array fa1 = { 1, 2, 3 };
38b4e715beeb670b30a8d1237085e3379fe28afb0fDouglas Gregorfloat_array fa2 = { 1, 2, 3, 4, 5, 6, 7, 8 };
39b4e715beeb670b30a8d1237085e3379fe28afb0fDouglas Gregor
40ba48d05c9c43dca8efa49d70ad3331fdcd6e2b3aDouglas Gregor// TYPE_VARIABLE_ARRAY in stmts.[ch]
41b4e715beeb670b30a8d1237085e3379fe28afb0fDouglas Gregor
42b4e715beeb670b30a8d1237085e3379fe28afb0fDouglas Gregor// TYPE_VECTOR
43b4e715beeb670b30a8d1237085e3379fe28afb0fDouglas Gregorfloat4 f4 = { 1.0, 2.0, 3.0, 4.0 };
44b4e715beeb670b30a8d1237085e3379fe28afb0fDouglas Gregor
45b4e715beeb670b30a8d1237085e3379fe28afb0fDouglas Gregor// TYPE_EXT_VECTOR
46b4e715beeb670b30a8d1237085e3379fe28afb0fDouglas Gregorext_float4 ef4 = { 1.0, 2.0, 3.0, 4.0 };
47b4e715beeb670b30a8d1237085e3379fe28afb0fDouglas Gregor
48b4e715beeb670b30a8d1237085e3379fe28afb0fDouglas Gregor// TYPE_FUNCTION_NO_PROTO
49b4e715beeb670b30a8d1237085e3379fe28afb0fDouglas Gregornoproto np1;
50b4e715beeb670b30a8d1237085e3379fe28afb0fDouglas Gregorint np1(x, y)
51b4e715beeb670b30a8d1237085e3379fe28afb0fDouglas Gregor     int x;
52b4e715beeb670b30a8d1237085e3379fe28afb0fDouglas Gregor     float y;
53b4e715beeb670b30a8d1237085e3379fe28afb0fDouglas Gregor{
54b4e715beeb670b30a8d1237085e3379fe28afb0fDouglas Gregor  return x;
55b4e715beeb670b30a8d1237085e3379fe28afb0fDouglas Gregor}
56b4e715beeb670b30a8d1237085e3379fe28afb0fDouglas Gregor
57b4e715beeb670b30a8d1237085e3379fe28afb0fDouglas Gregor// TYPE_FUNCTION_PROTO
58b4e715beeb670b30a8d1237085e3379fe28afb0fDouglas Gregorproto p1;
59b4e715beeb670b30a8d1237085e3379fe28afb0fDouglas Gregorfloat p1(float x, float y, ...) {
60b4e715beeb670b30a8d1237085e3379fe28afb0fDouglas Gregor  return x + y;
61b4e715beeb670b30a8d1237085e3379fe28afb0fDouglas Gregor}
62b4e715beeb670b30a8d1237085e3379fe28afb0fDouglas Gregorproto *p2 = p1;
63b4e715beeb670b30a8d1237085e3379fe28afb0fDouglas Gregor
64b4e715beeb670b30a8d1237085e3379fe28afb0fDouglas Gregor// TYPE_TYPEDEF
65b4e715beeb670b30a8d1237085e3379fe28afb0fDouglas Gregorint_ptr_ptr ipp = &int_value_ptr;
66b4e715beeb670b30a8d1237085e3379fe28afb0fDouglas Gregor
670b7489194f9f89fac39d57211c1e7953ae50251fDouglas Gregor// TYPE_TYPEOF_EXPR
680b7489194f9f89fac39d57211c1e7953ae50251fDouglas Gregortypeof_17 *t17 = &int_value;
690b7489194f9f89fac39d57211c1e7953ae50251fDouglas Gregorstruct S { int x, y; };
7008a41901e18aeb91b87d031b93df70374af02564Douglas Gregortypeof_17 t17_2 = (struct S){1, 2}; // expected-error{{initializing 'typeof_17' (aka 'int') with an expression of incompatible type 'struct S'}}
71b4e715beeb670b30a8d1237085e3379fe28afb0fDouglas Gregor
72b4e715beeb670b30a8d1237085e3379fe28afb0fDouglas Gregor// TYPE_TYPEOF
73b4e715beeb670b30a8d1237085e3379fe28afb0fDouglas Gregorint_ptr_ptr2 ipp2 = &int_value_ptr;
74