rnk added inline comments.
================ Comment at: clang/lib/Sema/SemaStmtAsm.cpp:381 + if (!Context.getTargetInfo().getCXXABI().isMicrosoft()) + if (const auto *UO = dyn_cast<UnaryOperator>(InputExpr)) + if (UO->getOpcode() == UO_AddrOf) ---------------- This is too narrow, there are lots of other ways to do this: ``` struct Foo { void method(); }; void f() { auto pmf = &Foo::method; asm volatile ("" : : "r"(pmf)); } ``` I think it makes sense to check for: * An expression with a member pointer type * Where the size of the type is larger than the size of a pointer, or word, or whatever proxy we normally use for the size of a general purpose register In the Microsoft ABI, member function pointers are only sometimes pointer-sized. If the class uses the multiple inheritance model, it will be bigger and include the this-adjuster field. See the inheritance keyword docs to learn more: https://learn.microsoft.com/en-us/cpp/cpp/inheritance-keywords?view=msvc-170 This also handles large pointers to data members in the MS ABI, which also has a wacky aggregate representation. Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D138514/new/ https://reviews.llvm.org/D138514 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits