forked from OSchip/llvm-project
				
			
		
			
				
	
	
		
			340 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			340 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			C
		
	
	
	
// RUN: %clang_cc1 -triple x86_64-unknown-unknown -Wno-unused-value -std=gnu11 -ast-dump %s | FileCheck -strict-whitespace %s
 | 
						|
 | 
						|
void Comma(void) {
 | 
						|
  1, 2, 3;
 | 
						|
  // CHECK: BinaryOperator 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:9> 'int' ','
 | 
						|
  // CHECK-NEXT: BinaryOperator 0x{{[^ ]*}} <col:3, col:6> 'int' ','
 | 
						|
  // CHECK-NEXT: IntegerLiteral 0x{{[^ ]*}} <col:3> 'int' 1
 | 
						|
  // CHECK-NEXT: IntegerLiteral 0x{{[^ ]*}} <col:6> 'int' 2
 | 
						|
  // CHECK-NEXT: IntegerLiteral 0x{{[^ ]*}} <col:9> 'int' 3
 | 
						|
}
 | 
						|
 | 
						|
void Assignment(int a) {
 | 
						|
  a = 12;
 | 
						|
  // CHECK: BinaryOperator 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:7> 'int' '='
 | 
						|
  // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:3> 'int' lvalue ParmVar 0x{{[^ ]*}} 'a' 'int'
 | 
						|
  // CHECK-NEXT: IntegerLiteral 0x{{[^ ]*}} <col:7> 'int' 12
 | 
						|
 | 
						|
  a += a;
 | 
						|
  // CHECK: CompoundAssignOperator 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:8> 'int' '+=' ComputeLHSTy='int' ComputeResultTy='int'
 | 
						|
  // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:3> 'int' lvalue ParmVar 0x{{[^ ]*}} 'a' 'int'
 | 
						|
  // CHECK-NEXT: ImplicitCastExpr
 | 
						|
  // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:8> 'int' lvalue ParmVar 0x{{[^ ]*}} 'a' 'int'
 | 
						|
}
 | 
						|
 | 
						|
void Conditionals(int a) {
 | 
						|
  a ? 0 : 1;
 | 
						|
  // CHECK: ConditionalOperator 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:11> 'int'
 | 
						|
  // CHECK-NEXT: ImplicitCastExpr
 | 
						|
  // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:3> 'int' lvalue ParmVar 0x{{[^ ]*}} 'a' 'int'
 | 
						|
  // CHECK-NEXT: IntegerLiteral 0x{{[^ ]*}} <col:7> 'int' 0
 | 
						|
  // CHECK-NEXT: IntegerLiteral 0x{{[^ ]*}} <col:11> 'int' 1
 | 
						|
 | 
						|
  a ?: 0;
 | 
						|
  // CHECK: BinaryConditionalOperator 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:8> 'int'
 | 
						|
  // CHECK-NEXT: ImplicitCastExpr
 | 
						|
  // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:3> 'int' lvalue ParmVar 0x{{[^ ]*}} 'a' 'int'
 | 
						|
  // CHECK-NEXT: OpaqueValueExpr 0x{{[^ ]*}} <col:3> 'int'
 | 
						|
  // CHECK-NEXT: ImplicitCastExpr
 | 
						|
  // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:3> 'int' lvalue ParmVar 0x{{[^ ]*}} 'a' 'int'
 | 
						|
  // CHECK-NEXT: OpaqueValueExpr 0x{{[^ ]*}} <col:3> 'int'
 | 
						|
  // CHECK-NEXT: ImplicitCastExpr
 | 
						|
  // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:3> 'int' lvalue ParmVar 0x{{[^ ]*}} 'a' 'int'
 | 
						|
  // CHECK-NEXT: IntegerLiteral 0x{{[^ ]*}} <col:8> 'int' 0
 | 
						|
}
 | 
						|
 | 
						|
void BinaryOperators(int a, int b) {
 | 
						|
  // Logical operators
 | 
						|
  a || b;
 | 
						|
  // CHECK: BinaryOperator 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:8> 'int' '||'
 | 
						|
  // CHECK-NEXT: ImplicitCastExpr
 | 
						|
  // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:3> 'int' lvalue ParmVar 0x{{[^ ]*}} 'a' 'int'
 | 
						|
  // CHECK-NEXT: ImplicitCastExpr
 | 
						|
  // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:8> 'int' lvalue ParmVar 0x{{[^ ]*}} 'b' 'int'
 | 
						|
 | 
						|
  a && b;
 | 
						|
  // CHECK: BinaryOperator 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:8> 'int' '&&'
 | 
						|
  // CHECK-NEXT: ImplicitCastExpr
 | 
						|
  // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:3> 'int' lvalue ParmVar 0x{{[^ ]*}} 'a' 'int'
 | 
						|
  // CHECK-NEXT: ImplicitCastExpr
 | 
						|
  // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:8> 'int' lvalue ParmVar 0x{{[^ ]*}} 'b' 'int'
 | 
						|
 | 
						|
  // Bitwise operators
 | 
						|
  a | b;
 | 
						|
  // CHECK: BinaryOperator 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:7> 'int' '|'
 | 
						|
  // CHECK-NEXT: ImplicitCastExpr
 | 
						|
  // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:3> 'int' lvalue ParmVar 0x{{[^ ]*}} 'a' 'int'
 | 
						|
  // CHECK-NEXT: ImplicitCastExpr
 | 
						|
  // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:7> 'int' lvalue ParmVar 0x{{[^ ]*}} 'b' 'int'
 | 
						|
 | 
						|
  a ^ b;
 | 
						|
  // CHECK: BinaryOperator 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:7> 'int' '^'
 | 
						|
  // CHECK-NEXT: ImplicitCastExpr
 | 
						|
  // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:3> 'int' lvalue ParmVar 0x{{[^ ]*}} 'a' 'int'
 | 
						|
  // CHECK-NEXT: ImplicitCastExpr
 | 
						|
  // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:7> 'int' lvalue ParmVar 0x{{[^ ]*}} 'b' 'int'
 | 
						|
 | 
						|
  a & b;
 | 
						|
  // CHECK: BinaryOperator 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:7> 'int' '&'
 | 
						|
  // CHECK-NEXT: ImplicitCastExpr
 | 
						|
  // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:3> 'int' lvalue ParmVar 0x{{[^ ]*}} 'a' 'int'
 | 
						|
  // CHECK-NEXT: ImplicitCastExpr
 | 
						|
  // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:7> 'int' lvalue ParmVar 0x{{[^ ]*}} 'b' 'int'
 | 
						|
 | 
						|
  // Equality operators
 | 
						|
  a == b;
 | 
						|
  // CHECK: BinaryOperator 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:8> 'int' '=='
 | 
						|
  // CHECK-NEXT: ImplicitCastExpr
 | 
						|
  // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:3> 'int' lvalue ParmVar 0x{{[^ ]*}} 'a' 'int'
 | 
						|
  // CHECK-NEXT: ImplicitCastExpr
 | 
						|
  // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:8> 'int' lvalue ParmVar 0x{{[^ ]*}} 'b' 'int'
 | 
						|
 | 
						|
  a != b;
 | 
						|
  // CHECK: BinaryOperator 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:8> 'int' '!='
 | 
						|
  // CHECK-NEXT: ImplicitCastExpr
 | 
						|
  // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:3> 'int' lvalue ParmVar 0x{{[^ ]*}} 'a' 'int'
 | 
						|
  // CHECK-NEXT: ImplicitCastExpr
 | 
						|
  // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:8> 'int' lvalue ParmVar 0x{{[^ ]*}} 'b' 'int'
 | 
						|
 | 
						|
  // Relational operators
 | 
						|
  a < b;
 | 
						|
  // CHECK: BinaryOperator 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:7> 'int' '<'
 | 
						|
  // CHECK-NEXT: ImplicitCastExpr
 | 
						|
  // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:3> 'int' lvalue ParmVar 0x{{[^ ]*}} 'a' 'int'
 | 
						|
  // CHECK-NEXT: ImplicitCastExpr
 | 
						|
  // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:7> 'int' lvalue ParmVar 0x{{[^ ]*}} 'b' 'int'
 | 
						|
 | 
						|
  a > b;
 | 
						|
  // CHECK: BinaryOperator 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:7> 'int' '>'
 | 
						|
  // CHECK-NEXT: ImplicitCastExpr
 | 
						|
  // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:3> 'int' lvalue ParmVar 0x{{[^ ]*}} 'a' 'int'
 | 
						|
  // CHECK-NEXT: ImplicitCastExpr
 | 
						|
  // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:7> 'int' lvalue ParmVar 0x{{[^ ]*}} 'b' 'int'
 | 
						|
 | 
						|
  a <= b;
 | 
						|
  // CHECK: BinaryOperator 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:8> 'int' '<='
 | 
						|
  // CHECK-NEXT: ImplicitCastExpr
 | 
						|
  // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:3> 'int' lvalue ParmVar 0x{{[^ ]*}} 'a' 'int'
 | 
						|
  // CHECK-NEXT: ImplicitCastExpr
 | 
						|
  // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:8> 'int' lvalue ParmVar 0x{{[^ ]*}} 'b' 'int'
 | 
						|
 | 
						|
  a >= b;
 | 
						|
  // CHECK: BinaryOperator 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:8> 'int' '>='
 | 
						|
  // CHECK-NEXT: ImplicitCastExpr
 | 
						|
  // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:3> 'int' lvalue ParmVar 0x{{[^ ]*}} 'a' 'int'
 | 
						|
  // CHECK-NEXT: ImplicitCastExpr
 | 
						|
  // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:8> 'int' lvalue ParmVar 0x{{[^ ]*}} 'b' 'int'
 | 
						|
 | 
						|
  // Bit shifting operators
 | 
						|
  a << b;
 | 
						|
  // CHECK: BinaryOperator 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:8> 'int' '<<'
 | 
						|
  // CHECK-NEXT: ImplicitCastExpr
 | 
						|
  // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:3> 'int' lvalue ParmVar 0x{{[^ ]*}} 'a' 'int'
 | 
						|
  // CHECK-NEXT: ImplicitCastExpr
 | 
						|
  // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:8> 'int' lvalue ParmVar 0x{{[^ ]*}} 'b' 'int'
 | 
						|
 | 
						|
  a >> b;
 | 
						|
  // CHECK: BinaryOperator 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:8> 'int' '>>'
 | 
						|
  // CHECK-NEXT: ImplicitCastExpr
 | 
						|
  // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:3> 'int' lvalue ParmVar 0x{{[^ ]*}} 'a' 'int'
 | 
						|
  // CHECK-NEXT: ImplicitCastExpr
 | 
						|
  // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:8> 'int' lvalue ParmVar 0x{{[^ ]*}} 'b' 'int'
 | 
						|
 | 
						|
  // Additive operators
 | 
						|
  a + b;
 | 
						|
  // CHECK: BinaryOperator 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:7> 'int' '+'
 | 
						|
  // CHECK-NEXT: ImplicitCastExpr
 | 
						|
  // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:3> 'int' lvalue ParmVar 0x{{[^ ]*}} 'a' 'int'
 | 
						|
  // CHECK-NEXT: ImplicitCastExpr
 | 
						|
  // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:7> 'int' lvalue ParmVar 0x{{[^ ]*}} 'b' 'int'
 | 
						|
 | 
						|
  a - b;
 | 
						|
  // CHECK: BinaryOperator 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:7> 'int' '-'
 | 
						|
  // CHECK-NEXT: ImplicitCastExpr
 | 
						|
  // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:3> 'int' lvalue ParmVar 0x{{[^ ]*}} 'a' 'int'
 | 
						|
  // CHECK-NEXT: ImplicitCastExpr
 | 
						|
  // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:7> 'int' lvalue ParmVar 0x{{[^ ]*}} 'b' 'int'
 | 
						|
 | 
						|
  // Multiplicative operators
 | 
						|
  a * b;
 | 
						|
  // CHECK: BinaryOperator 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:7> 'int' '*'
 | 
						|
  // CHECK-NEXT: ImplicitCastExpr
 | 
						|
  // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:3> 'int' lvalue ParmVar 0x{{[^ ]*}} 'a' 'int'
 | 
						|
  // CHECK-NEXT: ImplicitCastExpr
 | 
						|
  // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:7> 'int' lvalue ParmVar 0x{{[^ ]*}} 'b' 'int'
 | 
						|
 | 
						|
  a / b;
 | 
						|
  // CHECK: BinaryOperator 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:7> 'int' '/'
 | 
						|
  // CHECK-NEXT: ImplicitCastExpr
 | 
						|
  // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:3> 'int' lvalue ParmVar 0x{{[^ ]*}} 'a' 'int'
 | 
						|
  // CHECK-NEXT: ImplicitCastExpr
 | 
						|
  // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:7> 'int' lvalue ParmVar 0x{{[^ ]*}} 'b' 'int'
 | 
						|
 | 
						|
  a % b;
 | 
						|
  // CHECK: BinaryOperator 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:7> 'int' '%'
 | 
						|
  // CHECK-NEXT: ImplicitCastExpr
 | 
						|
  // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:3> 'int' lvalue ParmVar 0x{{[^ ]*}} 'a' 'int'
 | 
						|
  // CHECK-NEXT: ImplicitCastExpr
 | 
						|
  // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:7> 'int' lvalue ParmVar 0x{{[^ ]*}} 'b' 'int'
 | 
						|
}
 | 
						|
 | 
						|
void UnaryOperators(int a, int *b) {
 | 
						|
  // Cast operators
 | 
						|
  (float)a;
 | 
						|
  // CHECK: CStyleCastExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:10> 'float' <IntegralToFloating>
 | 
						|
  // CHECK-NEXT: ImplicitCastExpr
 | 
						|
  // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:10> 'int' lvalue ParmVar 0x{{[^ ]*}} 'a' 'int'
 | 
						|
 | 
						|
  // ++, --, and ~ are covered elsewhere.
 | 
						|
 | 
						|
  -a;
 | 
						|
  // CHECK: UnaryOperator 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:4> 'int' prefix '-'
 | 
						|
  // CHECK-NEXT: ImplicitCastExpr
 | 
						|
  // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:4> 'int' lvalue ParmVar 0x{{[^ ]*}} 'a' 'int'
 | 
						|
 | 
						|
  +a;
 | 
						|
  // CHECK: UnaryOperator 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:4> 'int' prefix '+' cannot overflow
 | 
						|
  // CHECK-NEXT: ImplicitCastExpr
 | 
						|
  // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:4> 'int' lvalue ParmVar 0x{{[^ ]*}} 'a' 'int'
 | 
						|
 | 
						|
  &a;
 | 
						|
  // CHECK: UnaryOperator 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:4> 'int *' prefix '&' cannot overflow
 | 
						|
  // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:4> 'int' lvalue ParmVar 0x{{[^ ]*}} 'a' 'int'
 | 
						|
 | 
						|
  *b;
 | 
						|
  // CHECK: ImplicitCastExpr
 | 
						|
  // CHECK-NEXT: UnaryOperator 0x{{[^ ]*}} <col:3, col:4> 'int' lvalue prefix '*' cannot overflow
 | 
						|
  // CHECK-NEXT: ImplicitCastExpr
 | 
						|
  // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:4> 'int *' lvalue ParmVar 0x{{[^ ]*}} 'b' 'int *'
 | 
						|
 | 
						|
  !a;
 | 
						|
  // CHECK: UnaryOperator 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:4> 'int' prefix '!' cannot overflow
 | 
						|
  // CHECK-NEXT: ImplicitCastExpr
 | 
						|
  // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:4> 'int' lvalue ParmVar 0x{{[^ ]*}} 'a' 'int'
 | 
						|
 | 
						|
  sizeof a;
 | 
						|
  // CHECK: UnaryExprOrTypeTraitExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:10> 'unsigned long' sizeof
 | 
						|
  // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:10> 'int' lvalue ParmVar 0x{{[^ ]*}} 'a' 'int'
 | 
						|
 | 
						|
  sizeof(int);
 | 
						|
  // CHECK: UnaryExprOrTypeTraitExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:13> 'unsigned long' sizeof 'int'
 | 
						|
 | 
						|
  _Alignof(int);
 | 
						|
  // FIXME: Uses C++ spelling for alignof in C mode.
 | 
						|
  // CHECK: UnaryExprOrTypeTraitExpr 0x{{[^ ]*}} <line:[[@LINE-2]]:3, col:15> 'unsigned long' alignof 'int'
 | 
						|
}
 | 
						|
 | 
						|
struct S {
 | 
						|
  int a;
 | 
						|
};
 | 
						|
 | 
						|
void PostfixOperators(int *a, struct S b, struct S *c) {
 | 
						|
  a[0];
 | 
						|
  // CHECK: ImplicitCastExpr
 | 
						|
  // CHECK-NEXT: ArraySubscriptExpr 0x{{[^ ]*}} <col:3, col:6> 'int' lvalue
 | 
						|
  // CHECK-NEXT: ImplicitCastExpr
 | 
						|
  // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:3> 'int *' lvalue ParmVar 0x{{[^ ]*}} 'a' 'int *'
 | 
						|
  // CHECK-NEXT: IntegerLiteral 0x{{[^ ]*}} <col:5> 'int' 0
 | 
						|
 | 
						|
  UnaryOperators(*a, a);
 | 
						|
  // CHECK: CallExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:23> 'void'
 | 
						|
  // CHECK-NEXT: ImplicitCastExpr
 | 
						|
  // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:3> 'void (int, int *)' Function 0x{{[^ ]*}} 'UnaryOperators' 'void (int, int *)'
 | 
						|
  // CHECK-NEXT: ImplicitCastExpr
 | 
						|
  // CHECK-NEXT: UnaryOperator 0x{{[^ ]*}} <col:18, col:19> 'int' lvalue prefix '*' cannot overflow
 | 
						|
  // CHECK-NEXT: ImplicitCastExpr
 | 
						|
  // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:19> 'int *' lvalue ParmVar 0x{{[^ ]*}} 'a' 'int *'
 | 
						|
  // CHECK-NEXT: ImplicitCastExpr
 | 
						|
  // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:22> 'int *' lvalue ParmVar 0x{{[^ ]*}} 'a' 'int *'
 | 
						|
 | 
						|
  b.a;
 | 
						|
  // CHECK: ImplicitCastExpr
 | 
						|
  // CHECK-NEXT: MemberExpr 0x{{[^ ]*}} <col:3, col:5> 'int' lvalue .a 0x{{[^ ]*}}
 | 
						|
  // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:3> 'struct S':'struct S' lvalue ParmVar 0x{{[^ ]*}} 'b' 'struct S':'struct S'
 | 
						|
 | 
						|
  c->a;
 | 
						|
  // CHECK: ImplicitCastExpr
 | 
						|
  // CHECK-NEXT: MemberExpr 0x{{[^ ]*}} <col:3, col:6> 'int' lvalue ->a 0x{{[^ ]*}}
 | 
						|
  // CHECK: ImplicitCastExpr
 | 
						|
  // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:3> 'struct S *' lvalue ParmVar 0x{{[^ ]*}} 'c' 'struct S *'
 | 
						|
 | 
						|
  // Postfix ++ and -- are covered elsewhere.
 | 
						|
 | 
						|
  (int [4]){1, 2, 3, 4, };
 | 
						|
  // CHECK: ImplicitCastExpr
 | 
						|
  // CHECK-NEXT: CompoundLiteralExpr 0x{{[^ ]*}} <col:3, col:25> 'int [4]' lvalue
 | 
						|
  // CHECK-NEXT: InitListExpr 0x{{[^ ]*}} <col:12, col:25> 'int [4]'
 | 
						|
  // CHECK-NEXT: IntegerLiteral 0x{{[^ ]*}} <col:13> 'int' 1
 | 
						|
  // CHECK-NEXT: IntegerLiteral 0x{{[^ ]*}} <col:16> 'int' 2
 | 
						|
  // CHECK-NEXT: IntegerLiteral 0x{{[^ ]*}} <col:19> 'int' 3
 | 
						|
  // CHECK-NEXT: IntegerLiteral 0x{{[^ ]*}} <col:22> 'int' 4
 | 
						|
 | 
						|
  (struct S){1};
 | 
						|
  // CHECK: ImplicitCastExpr
 | 
						|
  // CHECK-NEXT: CompoundLiteralExpr 0x{{[^ ]*}} <col:3, col:15> 'struct S':'struct S' lvalue
 | 
						|
  // CHECK-NEXT: InitListExpr 0x{{[^ ]*}} <col:13, col:15> 'struct S':'struct S'
 | 
						|
  // CHECK-NEXT: IntegerLiteral 0x{{[^ ]*}} <col:14> 'int' 1
 | 
						|
}
 | 
						|
 | 
						|
enum E { One };
 | 
						|
 | 
						|
void PrimaryExpressions(int a) {
 | 
						|
  a;
 | 
						|
  // CHECK: ImplicitCastExpr
 | 
						|
  // CHECK-NEXT: DeclRefExpr 0x{{[^ ]*}} <col:3> 'int' lvalue ParmVar 0x{{[^ ]*}} 'a' 'int'
 | 
						|
 | 
						|
  'a';
 | 
						|
  // CHECK: CharacterLiteral 0x{{[^ ]*}} <line:[[@LINE-1]]:3> 'int' 97
 | 
						|
 | 
						|
  L'a';
 | 
						|
  // CHECK: CharacterLiteral 0x{{[^ ]*}} <line:[[@LINE-1]]:3> 'int' 97
 | 
						|
 | 
						|
  "a";
 | 
						|
  // ImplicitCastExpr
 | 
						|
  // CHECK: StringLiteral 0x{{[^ ]*}} <col:3> 'char [2]' lvalue "a"
 | 
						|
 | 
						|
  L"a";
 | 
						|
  // ImplicitCastExpr
 | 
						|
  // CHECK: StringLiteral 0x{{[^ ]*}} <col:3> 'int [2]' lvalue L"a"
 | 
						|
 | 
						|
  u8"a";
 | 
						|
  // ImplicitCastExpr
 | 
						|
  // CHECK: StringLiteral 0x{{[^ ]*}} <col:3> 'char [2]' lvalue u8"a"
 | 
						|
 | 
						|
  U"a";
 | 
						|
  // ImplicitCastExpr
 | 
						|
  // CHECK: StringLiteral 0x{{[^ ]*}} <col:3> 'unsigned int [2]' lvalue U"a"
 | 
						|
 | 
						|
  u"a";
 | 
						|
  // ImplicitCastExpr
 | 
						|
  // CHECK: StringLiteral 0x{{[^ ]*}} <col:3> 'unsigned short [2]' lvalue u"a"
 | 
						|
 | 
						|
  1;
 | 
						|
  // CHECK: IntegerLiteral 0x{{[^ ]*}} <line:[[@LINE-1]]:3> 'int' 1
 | 
						|
 | 
						|
  1u;
 | 
						|
  // CHECK: IntegerLiteral 0x{{[^ ]*}} <line:[[@LINE-1]]:3> 'unsigned int' 1
 | 
						|
 | 
						|
  1ll;
 | 
						|
  // CHECK: IntegerLiteral 0x{{[^ ]*}} <line:[[@LINE-1]]:3> 'long long' 1
 | 
						|
 | 
						|
  1.0;
 | 
						|
  // CHECK: FloatingLiteral 0x{{[^ ]*}} <line:[[@LINE-1]]:3> 'double' {{1\.[0]*e[\+]?[0]+}}
 | 
						|
 | 
						|
  1.0f;
 | 
						|
  // CHECK: FloatingLiteral 0x{{[^ ]*}} <line:[[@LINE-1]]:3> 'float' {{1\.[0]*e[\+]?[0]+}}
 | 
						|
 | 
						|
  1.0l;
 | 
						|
  // CHECK: FloatingLiteral 0x{{[^ ]*}} <line:[[@LINE-1]]:3> 'long double' {{1\.[0]*e[\+]?[0]+}}
 | 
						|
 | 
						|
  One;
 | 
						|
  // CHECK: DeclRefExpr 0x{{[^ ]*}} <line:[[@LINE-1]]:3> 'int' EnumConstant 0x{{[^ ]*}} 'One' 'int'
 | 
						|
 | 
						|
  (a);
 | 
						|
  // CHECK: ImplicitCastExpr
 | 
						|
  // CHECK-NEXT: ParenExpr 0x{{[^ ]*}} <col:3, col:5> 'int' lvalue
 | 
						|
  // CHECK: DeclRefExpr 0x{{[^ ]*}} <col:4> 'int' lvalue ParmVar 0x{{[^ ]*}} 'a' 'int'
 | 
						|
 | 
						|
  // Generic selection expressions are covered elsewhere.
 | 
						|
}
 |