mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2024-11-27 07:31:28 +00:00
Fix PR#62594 : static lambda call operator is not convertible to function pointer on win32
See issue https://github.com/llvm/llvm-project/issues/62594 This code does not work on win32: auto lstatic = []() static { return 0; }; int (*f2)(void) = lstatic; Since a calling convention such as CC_X86ThisCall can rightly interfere with the implicit pointer to function conversion if erroneously marked on a static function, the fix entails checking the 'static' specifier on the lambda declarator prior to assigning it a calling convention of an non-static member (which pre-c++23 made sense).
This commit is contained in:
parent
8049db0990
commit
5bdd5d064d
@ -283,6 +283,10 @@ Bug Fixes to C++ Support
|
||||
- Clang now properly handles out of line template specializations when there is
|
||||
a non-template inner-class between the function and the class template.
|
||||
(`#65810 <https://github.com/llvm/llvm-project/issues/65810>`_)
|
||||
|
||||
- Clang now properly converts static lambda call operator to function
|
||||
pointer on win32.
|
||||
(`#62594 <https://github.com/llvm/llvm-project/issues/62594>`_)
|
||||
|
||||
Bug Fixes to AST Handling
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
@ -4095,8 +4095,9 @@ static CallingConv getCCForDeclaratorChunk(
|
||||
D.getTypeObject(I).Kind == DeclaratorChunk::MemberPointer;
|
||||
} else if (D.getContext() == DeclaratorContext::LambdaExpr) {
|
||||
// This can only be a call operator for a lambda, which is an instance
|
||||
// method.
|
||||
IsCXXInstanceMethod = true;
|
||||
// method, unless explicitly specified as 'static'.
|
||||
IsCXXInstanceMethod =
|
||||
D.getDeclSpec().getStorageClassSpec() != DeclSpec::SCS_static;
|
||||
} else {
|
||||
// We're the innermost decl chunk, so must be a function declarator.
|
||||
assert(D.isFunctionDeclarator());
|
||||
|
33
clang/test/SemaCXX/cxx23-static-callop-lambda-expression.cpp
Normal file
33
clang/test/SemaCXX/cxx23-static-callop-lambda-expression.cpp
Normal file
@ -0,0 +1,33 @@
|
||||
// RUN: %clang_cc1 -std=c++23 -fsyntax-only -verify %s
|
||||
|
||||
|
||||
namespace ns1 {
|
||||
auto lstatic = []() static { return 3; };
|
||||
int (*f2)(void) = lstatic;
|
||||
|
||||
}
|
||||
|
||||
namespace ns1_1 {
|
||||
|
||||
auto lstatic = []() static consteval //expected-error{{cannot take address of consteval call}} \
|
||||
expected-note {{declared here}}
|
||||
{ return 3; };
|
||||
|
||||
// FIXME: the above error should indicate that it was triggered below.
|
||||
int (*f2)(void) = lstatic;
|
||||
|
||||
}
|
||||
|
||||
|
||||
namespace ns2 {
|
||||
auto lstatic = []() static { return 3; };
|
||||
constexpr int (*f2)(void) = lstatic;
|
||||
static_assert(lstatic() == f2());
|
||||
}
|
||||
|
||||
namespace ns3 {
|
||||
void main() {
|
||||
static int x = 10;
|
||||
auto L = []() static { return x; };
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user