[HIP][Clang][Sema] Fix crash when calling builtins with pointer arguments (#95957)

Crashed when the number of args passed was less than number of
parameters in builtin definition, because we were indexing the list of
args while iterating through the entire number of parameters.
This commit is contained in:
Raymond Tian 2024-07-01 11:54:04 -07:00 committed by GitHub
parent dbf12b2f77
commit 8477ca6e8e
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 30 additions and 1 deletions

View File

@ -6500,7 +6500,8 @@ ExprResult Sema::BuildCallExpr(Scope *Scope, Expr *Fn, SourceLocation LParenLoc,
// the parameter type.
if (getLangOpts().HIP && getLangOpts().CUDAIsDevice && FD &&
FD->getBuiltinID()) {
for (unsigned Idx = 0; Idx < FD->param_size(); ++Idx) {
for (unsigned Idx = 0; Idx < ArgExprs.size() && Idx < FD->param_size();
++Idx) {
ParmVarDecl *Param = FD->getParamDecl(Idx);
if (!ArgExprs[Idx] || !Param || !Param->getType()->isPointerType() ||
!ArgExprs[Idx]->getType()->isPointerType())

View File

@ -0,0 +1,28 @@
// REQUIRES: amdgpu-registered-target
// REQUIRES: x86-registered-target
// RUN: %clang_cc1 -triple amdgcn-amd-amdhsa -aux-triple x86_64-unknown-linux-gnu -fcuda-is-device -fsyntax-only -verify %s
void call_amdgpu_builtins() {
__builtin_amdgcn_fence(); // expected-error {{too few arguments to function call, expected at least 2, have 0}}
__builtin_amdgcn_atomic_inc32(); // expected-error {{too few arguments to function call, expected 4, have 0}}
__builtin_amdgcn_atomic_inc32(0); // expected-error {{too few arguments to function call, expected 4, have 1}}
__builtin_amdgcn_atomic_inc32(0, 0); // expected-error {{too few arguments to function call, expected 4, have 2}}
__builtin_amdgcn_atomic_inc32(0, 0, 0); // expected-error {{too few arguments to function call, expected 4, have 3}}
__builtin_amdgcn_atomic_inc64(); // expected-error {{too few arguments to function call, expected 4, have 0}}
__builtin_amdgcn_atomic_dec32(); // expected-error {{too few arguments to function call, expected 4, have 0}}
__builtin_amdgcn_atomic_dec64(); // expected-error {{too few arguments to function call, expected 4, have 0}}
__builtin_amdgcn_div_scale(); // expected-error {{too few arguments to function call, expected 4, have 0}}
__builtin_amdgcn_div_scale(0); // expected-error {{too few arguments to function call, expected 4, have 1}}
__builtin_amdgcn_div_scale(0, 0); // expected-error {{too few arguments to function call, expected 4, have 2}}
__builtin_amdgcn_div_scale(0, 0, 0); // expected-error {{too few arguments to function call, expected 4, have 3}}
__builtin_amdgcn_div_scalef(); // expected-error {{too few arguments to function call, expected 4, have 0}}
__builtin_amdgcn_ds_faddf(); // expected-error {{too few arguments to function call, expected 5, have 0}}
__builtin_amdgcn_ds_fminf(); // expected-error {{too few arguments to function call, expected 5, have 0}}
__builtin_amdgcn_ds_fmaxf(); // expected-error {{too few arguments to function call, expected 5, have 0}}
__builtin_amdgcn_ds_append(); // expected-error {{too few arguments to function call, expected 1, have 0}}
__builtin_amdgcn_ds_consume(); // expected-error {{too few arguments to function call, expected 1, have 0}}
__builtin_amdgcn_is_shared(); // expected-error {{too few arguments to function call, expected 1, have 0}}
__builtin_amdgcn_is_private(); // expected-error {{too few arguments to function call, expected 1, have 0}}
}