Skip to content

Commit fe528e7

Browse files
committed
[CUDA] Don't call inferCUDATargetForImplicitSpecialMember too early.
Otherwise we may crash because the special member has not been sufficiently set up yet. Fixes llvm#54537 Differential Revision: https://reviews.llvm.org/D122846
1 parent 0fb6856 commit fe528e7

File tree

2 files changed

+34
-24
lines changed

2 files changed

+34
-24
lines changed

clang/lib/Sema/SemaDeclCXX.cpp

Lines changed: 18 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -13415,14 +13415,13 @@ CXXConstructorDecl *Sema::DeclareImplicitDefaultConstructor(
1341513415
DefaultCon->setAccess(AS_public);
1341613416
DefaultCon->setDefaulted();
1341713417

13418-
if (getLangOpts().CUDA) {
13418+
setupImplicitSpecialMemberType(DefaultCon, Context.VoidTy, None);
13419+
13420+
if (getLangOpts().CUDA)
1341913421
inferCUDATargetForImplicitSpecialMember(ClassDecl, CXXDefaultConstructor,
1342013422
DefaultCon,
1342113423
/* ConstRHS */ false,
1342213424
/* Diagnose */ false);
13423-
}
13424-
13425-
setupImplicitSpecialMemberType(DefaultCon, Context.VoidTy, None);
1342613425

1342713426
// We don't need to use SpecialMemberIsTrivial here; triviality for default
1342813427
// constructors is easy to compute.
@@ -13696,14 +13695,13 @@ CXXDestructorDecl *Sema::DeclareImplicitDestructor(CXXRecordDecl *ClassDecl) {
1369613695
Destructor->setAccess(AS_public);
1369713696
Destructor->setDefaulted();
1369813697

13699-
if (getLangOpts().CUDA) {
13698+
setupImplicitSpecialMemberType(Destructor, Context.VoidTy, None);
13699+
13700+
if (getLangOpts().CUDA)
1370013701
inferCUDATargetForImplicitSpecialMember(ClassDecl, CXXDestructor,
1370113702
Destructor,
1370213703
/* ConstRHS */ false,
1370313704
/* Diagnose */ false);
13704-
}
13705-
13706-
setupImplicitSpecialMemberType(Destructor, Context.VoidTy, None);
1370713705

1370813706
// We don't need to use SpecialMemberIsTrivial here; triviality for
1370913707
// destructors is easy to compute.
@@ -14336,14 +14334,13 @@ CXXMethodDecl *Sema::DeclareImplicitCopyAssignment(CXXRecordDecl *ClassDecl) {
1433614334
CopyAssignment->setDefaulted();
1433714335
CopyAssignment->setImplicit();
1433814336

14339-
if (getLangOpts().CUDA) {
14337+
setupImplicitSpecialMemberType(CopyAssignment, RetType, ArgType);
14338+
14339+
if (getLangOpts().CUDA)
1434014340
inferCUDATargetForImplicitSpecialMember(ClassDecl, CXXCopyAssignment,
1434114341
CopyAssignment,
1434214342
/* ConstRHS */ Const,
1434314343
/* Diagnose */ false);
14344-
}
14345-
14346-
setupImplicitSpecialMemberType(CopyAssignment, RetType, ArgType);
1434714344

1434814345
// Add the parameter to the operator.
1434914346
ParmVarDecl *FromParam = ParmVarDecl::Create(Context, CopyAssignment,
@@ -14671,14 +14668,13 @@ CXXMethodDecl *Sema::DeclareImplicitMoveAssignment(CXXRecordDecl *ClassDecl) {
1467114668
MoveAssignment->setDefaulted();
1467214669
MoveAssignment->setImplicit();
1467314670

14674-
if (getLangOpts().CUDA) {
14671+
setupImplicitSpecialMemberType(MoveAssignment, RetType, ArgType);
14672+
14673+
if (getLangOpts().CUDA)
1467514674
inferCUDATargetForImplicitSpecialMember(ClassDecl, CXXMoveAssignment,
1467614675
MoveAssignment,
1467714676
/* ConstRHS */ false,
1467814677
/* Diagnose */ false);
14679-
}
14680-
14681-
setupImplicitSpecialMemberType(MoveAssignment, RetType, ArgType);
1468214678

1468314679
// Add the parameter to the operator.
1468414680
ParmVarDecl *FromParam = ParmVarDecl::Create(Context, MoveAssignment,
@@ -15050,14 +15046,13 @@ CXXConstructorDecl *Sema::DeclareImplicitCopyConstructor(
1505015046
CopyConstructor->setAccess(AS_public);
1505115047
CopyConstructor->setDefaulted();
1505215048

15053-
if (getLangOpts().CUDA) {
15049+
setupImplicitSpecialMemberType(CopyConstructor, Context.VoidTy, ArgType);
15050+
15051+
if (getLangOpts().CUDA)
1505415052
inferCUDATargetForImplicitSpecialMember(ClassDecl, CXXCopyConstructor,
1505515053
CopyConstructor,
1505615054
/* ConstRHS */ Const,
1505715055
/* Diagnose */ false);
15058-
}
15059-
15060-
setupImplicitSpecialMemberType(CopyConstructor, Context.VoidTy, ArgType);
1506115056

1506215057
// During template instantiation of special member functions we need a
1506315058
// reliable TypeSourceInfo for the parameter types in order to allow functions
@@ -15190,14 +15185,13 @@ CXXConstructorDecl *Sema::DeclareImplicitMoveConstructor(
1519015185
MoveConstructor->setAccess(AS_public);
1519115186
MoveConstructor->setDefaulted();
1519215187

15193-
if (getLangOpts().CUDA) {
15188+
setupImplicitSpecialMemberType(MoveConstructor, Context.VoidTy, ArgType);
15189+
15190+
if (getLangOpts().CUDA)
1519415191
inferCUDATargetForImplicitSpecialMember(ClassDecl, CXXMoveConstructor,
1519515192
MoveConstructor,
1519615193
/* ConstRHS */ false,
1519715194
/* Diagnose */ false);
15198-
}
15199-
15200-
setupImplicitSpecialMemberType(MoveConstructor, Context.VoidTy, ArgType);
1520115195

1520215196
// Add the parameter to the constructor.
1520315197
ParmVarDecl *FromParam = ParmVarDecl::Create(Context, MoveConstructor,

clang/test/SemaCUDA/pr54537.cu

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
// Regression test for the crash in
2+
// https://github.com/llvm/llvm-project/issues/54537
3+
//
4+
// RUN: %clang_cc1 -std=c++20 -fsyntax-only -verify %s
5+
// expected-no-diagnostics
6+
7+
template< class T > inline constexpr bool test_v = true;
8+
9+
template <typename T>
10+
struct A {
11+
A(const T = 1 ) requires test_v<T>;
12+
};
13+
14+
struct B : A<int> {
15+
using A<int>::A;
16+
};

0 commit comments

Comments
 (0)