1 // RUN: %clang_cc1 -std=c++2a -emit-llvm %s -o - -triple %itanium_abi_triple | FileCheck %s --check-prefix=ITANIUM
2 // RUN: not %clang_cc1 -std=c++2a -emit-llvm %s -o - -triple %ms_abi_triple 2>&1 | FileCheck %s --check-prefix=MSABI
3 // RUN: not %clang_cc1 -std=c++2a -emit-llvm %s -o - -triple %itanium_abi_triple -DBUILTIN 2>&1 | FileCheck %s --check-prefix=BUILTIN
4 // MSABI: cannot mangle this three-way comparison operator yet
5 
6 struct A {
7   void operator<=>(int);
8 };
9 
10 // ITANIUM: define {{.*}}@_ZN1AssEi(
11 void A::operator<=>(int) {}
12 
13 // ITANIUM: define {{.*}}@_Zssi1A(
14 void operator<=>(int, A) {}
15 
16 int operator<=>(A, A);
17 
18 // ITANIUM: define {{.*}}_Z1f1A(
19 int f(A a) {
20   // ITANIUM: %[[RET:.*]] = call {{.*}}_Zss1AS_(
21   // ITANIUM: ret i32 %[[RET]]
22   return a <=> a;
23 }
24 
25 #ifdef BUILTIN
26 void builtin(int a) {
27   a <=> a; // BUILTIN: cannot compile this scalar expression yet
28 }
29 #endif
30