Fix passing mode computation for methods. (#7225)

We were incorrectly computing the index of the Clang implicit conversion
corresponding to method arguments. This led to wrong code and a crash in
lowering due to a calling convention mismatch.

Fixes #7224.

Assisted-by: Gemini via Antigravity
This commit is contained in:
Richard Smith
2026-05-18 20:30:23 +00:00
committed by GitHub
parent 773ecdfac6
commit b87f848db4
3 changed files with 75 additions and 33 deletions
+5 -6
View File
@@ -243,12 +243,11 @@ auto ComputeClangDeclSignatureFromBestViableFunction(
// Compute which conversion sequence corresponds to this argument.
// TODO: Clang should expose a way to compute this.
int conversion_index = i;
if (auto* method = dyn_cast<clang::CXXMethodDecl>(candidate->Function)) {
if (method->isStatic()) {
// Static methods get an object parameter conversion at index 0, even
// though there's no argument.
++conversion_index;
}
if (isa<clang::CXXMethodDecl>(candidate->Function) &&
!isa<clang::CXXConstructorDecl>(candidate->Function)) {
// Methods (both static and non-static, but not constructors) get an
// object parameter conversion at index 0.
++conversion_index;
}
signature.passing_modes.push_back(GetPassingModeForCppParameter(