xref: /llvm-project/clang/test/Sema/gnu-asm-pmf.cpp (revision ba15d186e5cef2620d562c6c9d9a6d570382cd0a)
1 // RUN: %clang_cc1 -triple x86_64-unknown-windows-msvc -std=c++23 -fsyntax-only %s -verify
2 // RUN: %clang_cc1 -triple x86_64-unknown-windows-itanium -std=c++23 -fsyntax-only %s -verify
3 
4 struct S {
5   void operator()();
6 };
7 
8 struct T {
9   virtual void operator()();
10 };
11 
12 struct U {
13   static void operator()();
14 };
15 
16 struct V: virtual T {
17   virtual void f();
18 };
19 
20 struct W : virtual V {
21   int i;
22 };
23 
24 struct X {
25   __UINTPTR_TYPE__ ptr;
26   __UINTPTR_TYPE__ adj;
27 };
28 
__anon836ffe130102()29 auto L = [](){};
30 
f()31 void f() {
32   auto pmf = &S::operator();
33 
34   __asm__ __volatile__ ("" : : "r"(&decltype(L)::operator()));
35   // expected-error@-1{{cannot pass a pointer-to-member through register-constrained inline assembly parameter}}
36   __asm__ __volatile__ ("" : : "r"(&S::operator()));
37   // expected-error@-1{{cannot pass a pointer-to-member through register-constrained inline assembly parameter}}
38   __asm__ __volatile__ ("" : : "r"(&T::operator()));
39   // expected-error@-1{{cannot pass a pointer-to-member through register-constrained inline assembly parameter}}
40   __asm__ __volatile__ ("" : : "r"(pmf));
41   // expected-error@-1{{cannot pass a pointer-to-member through register-constrained inline assembly parameter}}
42   __asm__ __volatile__ ("" : : "r"(&W::f));
43   // expected-error@-1{{cannot pass a pointer-to-member through register-constrained inline assembly parameter}}
44   __asm__ __volatile__ ("" : : "r"(&W::i));
45   // expected-error@-1{{cannot pass a pointer-to-member through register-constrained inline assembly parameter}}
46 
47   __asm__ __volatile__ ("" : : "r"(X{0,0}));
48   __asm__ __volatile__ ("" : : "r"(&U::operator()));
49 }
50