@@ -1455,13 +1455,8 @@ class SyclKernelBodyCreator : public SyclKernelFieldHandler {
1455
1455
InitExprs.push_back (ILE);
1456
1456
}
1457
1457
1458
- void createSpecialMethodCall (const CXXRecordDecl *SpecialClass, Expr *Base,
1459
- const std::string &MethodName,
1460
- FieldDecl *Field) {
1461
- CXXMethodDecl *Method = getMethodByName (SpecialClass, MethodName);
1462
- assert (Method &&
1463
- " The accessor/sampler/stream must have the __init method. Stream"
1464
- " must also have __finalize method" );
1458
+ CXXMemberCallExpr *createSpecialMethodCall (Expr *Base, CXXMethodDecl *Method,
1459
+ FieldDecl *Field) {
1465
1460
unsigned NumParams = Method->getNumParams ();
1466
1461
llvm::SmallVector<Expr *, 4 > ParamDREs (NumParams);
1467
1462
llvm::ArrayRef<ParmVarDecl *> KernelParameters =
@@ -1485,10 +1480,7 @@ class SyclKernelBodyCreator : public SyclKernelFieldHandler {
1485
1480
CXXMemberCallExpr *Call = CXXMemberCallExpr::Create (
1486
1481
SemaRef.Context , MethodME, ParamStmts, ResultTy, VK, SourceLocation (),
1487
1482
FPOptionsOverride ());
1488
- if (MethodName == FinalizeMethodName)
1489
- FinalizeStmts.push_back (Call);
1490
- else
1491
- BodyStmts.push_back (Call);
1483
+ return Call;
1492
1484
}
1493
1485
1494
1486
// FIXME Avoid creation of kernel obj clone.
@@ -1517,8 +1509,12 @@ class SyclKernelBodyCreator : public SyclKernelFieldHandler {
1517
1509
ExprResult MemberInit = InitSeq.Perform (SemaRef, Entity, InitKind, None);
1518
1510
InitExprs.push_back (MemberInit.get ());
1519
1511
1520
- createSpecialMethodCall (RecordDecl, MemberExprBases.back (), InitMethodName,
1521
- FD);
1512
+ CXXMethodDecl *InitMethod = getMethodByName (RecordDecl, InitMethodName);
1513
+ if (InitMethod) {
1514
+ CXXMemberCallExpr *InitCall =
1515
+ createSpecialMethodCall (MemberExprBases.back (), InitMethod, FD);
1516
+ BodyStmts.push_back (InitCall);
1517
+ }
1522
1518
return true ;
1523
1519
}
1524
1520
@@ -1535,8 +1531,12 @@ class SyclKernelBodyCreator : public SyclKernelFieldHandler {
1535
1531
ExprResult MemberInit = InitSeq.Perform (SemaRef, Entity, InitKind, None);
1536
1532
InitExprs.push_back (MemberInit.get ());
1537
1533
1538
- createSpecialMethodCall (RecordDecl, MemberExprBases.back (), InitMethodName,
1539
- nullptr );
1534
+ CXXMethodDecl *InitMethod = getMethodByName (RecordDecl, InitMethodName);
1535
+ if (InitMethod) {
1536
+ CXXMemberCallExpr *InitCall =
1537
+ createSpecialMethodCall (MemberExprBases.back (), InitMethod, nullptr );
1538
+ BodyStmts.push_back (InitCall);
1539
+ }
1540
1540
return true ;
1541
1541
}
1542
1542
@@ -1578,14 +1578,27 @@ class SyclKernelBodyCreator : public SyclKernelFieldHandler {
1578
1578
return handleSpecialType (FD, Ty);
1579
1579
}
1580
1580
1581
+ bool handleSyclSpecConstantType (FieldDecl *FD, QualType Ty) final {
1582
+ return handleSpecialType (FD, Ty);
1583
+ }
1584
+
1581
1585
bool handleSyclStreamType (FieldDecl *FD, QualType Ty) final {
1582
1586
const auto *StreamDecl = Ty->getAsCXXRecordDecl ();
1583
1587
createExprForStructOrScalar (FD);
1584
1588
size_t NumBases = MemberExprBases.size ();
1585
- createSpecialMethodCall (StreamDecl, MemberExprBases[NumBases - 2 ],
1586
- InitMethodName, FD);
1587
- createSpecialMethodCall (StreamDecl, MemberExprBases[NumBases - 2 ],
1588
- FinalizeMethodName, FD);
1589
+ CXXMethodDecl *InitMethod = getMethodByName (StreamDecl, InitMethodName);
1590
+ if (InitMethod) {
1591
+ CXXMemberCallExpr *InitCall =
1592
+ createSpecialMethodCall (MemberExprBases.back (), InitMethod, FD);
1593
+ BodyStmts.push_back (InitCall);
1594
+ }
1595
+ CXXMethodDecl *FinalizeMethod =
1596
+ getMethodByName (StreamDecl, FinalizeMethodName);
1597
+ if (FinalizeMethod) {
1598
+ CXXMemberCallExpr *FinalizeCall = createSpecialMethodCall (
1599
+ MemberExprBases[NumBases - 2 ], FinalizeMethod, FD);
1600
+ FinalizeStmts.push_back (FinalizeCall);
1601
+ }
1589
1602
return true ;
1590
1603
}
1591
1604
@@ -1796,7 +1809,7 @@ class SyclKernelIntHeaderCreator : public SyclKernelFieldHandler {
1796
1809
cast<ClassTemplateSpecializationDecl>(FieldTy->getAsRecordDecl ())
1797
1810
->getTemplateInstantiationArgs ();
1798
1811
assert (TemplateArgs.size () == 2 &&
1799
- " Incorrect template args for Accessor Type " );
1812
+ " Incorrect template args for spec constant type " );
1800
1813
// Get specialization constant ID type, which is the second template
1801
1814
// argument.
1802
1815
QualType SpecConstIDTy = TemplateArgs.get (1 ).getAsType ().getCanonicalType ();
0 commit comments