// Header for PCH test exprs.c

// DeclRefExpr
int i = 17;
enum Enum { Enumerator = 18 };
typedef typeof(i) int_decl_ref;
typedef typeof(Enumerator) enum_decl_ref;

// IntegerLiteral
typedef typeof(17) integer_literal;
typedef typeof(17l) long_literal;

// FloatingLiteral and ParenExpr
typedef typeof((42.5)) floating_literal;

// ImaginaryLiteral
typedef typeof(17.0i) imaginary_literal;

// StringLiteral
const char *hello = "Hello" "PCH" "World";

// CharacterLiteral
typedef typeof('a') char_literal;

// UnaryOperator
typedef typeof(-Enumerator) negate_enum;

// OffsetOfExpr
struct X {
  int member;
};
struct Y {
  struct X array[5];
};
struct Z {
  struct Y y;
};
typedef typeof(__builtin_offsetof(struct Z, y.array[1 + 2].member)) 
  offsetof_type;

// UnaryExprOrTypeTraitExpr
typedef typeof(sizeof(int)) typeof_sizeof;
typedef typeof(sizeof(Enumerator)) typeof_sizeof2;

// ArraySubscriptExpr
extern double values[];
typedef typeof(values[2]) array_subscript;

// CallExpr
double dplus(double x, double y);
double d0, d1;
typedef typeof((&dplus)(d0, d1)) call_returning_double;

// MemberExpr
struct S {
  double x;
};
typedef typeof(((struct S*)0)->x) member_ref_double;

// BinaryOperator
typedef typeof(i + Enumerator) add_result;

// CompoundAssignOperator
typedef typeof(i += Enumerator) addeq_result;

// ConditionalOperator
typedef typeof(i? : d0) conditional_operator;

// CStyleCastExpr
typedef typeof((void *)0) void_ptr;

// CompoundLiteral
typedef typeof((struct S){.x = 3.5}) compound_literal;

typedef typeof(i + sizeof(int[i + Enumerator])) add_result_with_typeinfo;

// ExtVectorElementExpr
typedef __attribute__(( ext_vector_type(2) )) double double2;
extern double2 vec2, vec2b;
typedef typeof(vec2.x) ext_vector_element;

// InitListExpr
double double_array[3] = { 1.0, 2.0 };

// DesignatedInitExpr
struct {
  int x;
  float y;
} designated_inits[3] = { [0].y = 17,
                          [2].x = 12.3, // expected-warning {{implicit conversion from 'double' to 'int' changes value from 12.3 to 12}}
                          3.5 };

// TypesCompatibleExpr
typedef typeof(__builtin_types_compatible_p(float, double)) types_compatible;

// ChooseExpr
typedef typeof(__builtin_choose_expr(17 > 19, d0, 1)) choose_expr;

// GNUNullExpr FIXME: needs C++
// typedef typeof(__null) null_type;

// ShuffleVectorExpr
typedef typeof(__builtin_shufflevector(vec2, vec2b, 2, 1)) shuffle_expr;

// ConvertVectorExpr
typedef __attribute__(( ext_vector_type(2) )) float float2;
typedef typeof(__builtin_convertvector(vec2, float2)) convert_expr;

// GenericSelectionExpr
typedef typeof(_Generic(i, char*: 0, int: 0., default: hello))
  generic_selection_expr;
