@@ -1455,13 +1455,8 @@ class SyclKernelBodyCreator : public SyclKernelFieldHandler {
14551455 InitExprs.push_back (ILE);
14561456 }
14571457
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) {
14651460 unsigned NumParams = Method->getNumParams ();
14661461 llvm::SmallVector<Expr *, 4 > ParamDREs (NumParams);
14671462 llvm::ArrayRef<ParmVarDecl *> KernelParameters =
@@ -1485,10 +1480,7 @@ class SyclKernelBodyCreator : public SyclKernelFieldHandler {
14851480 CXXMemberCallExpr *Call = CXXMemberCallExpr::Create (
14861481 SemaRef.Context , MethodME, ParamStmts, ResultTy, VK, SourceLocation (),
14871482 FPOptionsOverride ());
1488- if (MethodName == FinalizeMethodName)
1489- FinalizeStmts.push_back (Call);
1490- else
1491- BodyStmts.push_back (Call);
1483+ return Call;
14921484 }
14931485
14941486 // FIXME Avoid creation of kernel obj clone.
@@ -1517,8 +1509,12 @@ class SyclKernelBodyCreator : public SyclKernelFieldHandler {
15171509 ExprResult MemberInit = InitSeq.Perform (SemaRef, Entity, InitKind, None);
15181510 InitExprs.push_back (MemberInit.get ());
15191511
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+ }
15221518 return true ;
15231519 }
15241520
@@ -1535,8 +1531,12 @@ class SyclKernelBodyCreator : public SyclKernelFieldHandler {
15351531 ExprResult MemberInit = InitSeq.Perform (SemaRef, Entity, InitKind, None);
15361532 InitExprs.push_back (MemberInit.get ());
15371533
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+ }
15401540 return true ;
15411541 }
15421542
@@ -1578,14 +1578,27 @@ class SyclKernelBodyCreator : public SyclKernelFieldHandler {
15781578 return handleSpecialType (FD, Ty);
15791579 }
15801580
1581+ bool handleSyclSpecConstantType (FieldDecl *FD, QualType Ty) final {
1582+ return handleSpecialType (FD, Ty);
1583+ }
1584+
15811585 bool handleSyclStreamType (FieldDecl *FD, QualType Ty) final {
15821586 const auto *StreamDecl = Ty->getAsCXXRecordDecl ();
15831587 createExprForStructOrScalar (FD);
15841588 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+ }
15891602 return true ;
15901603 }
15911604
@@ -1796,7 +1809,7 @@ class SyclKernelIntHeaderCreator : public SyclKernelFieldHandler {
17961809 cast<ClassTemplateSpecializationDecl>(FieldTy->getAsRecordDecl ())
17971810 ->getTemplateInstantiationArgs ();
17981811 assert (TemplateArgs.size () == 2 &&
1799- " Incorrect template args for Accessor Type " );
1812+ " Incorrect template args for spec constant type " );
18001813 // Get specialization constant ID type, which is the second template
18011814 // argument.
18021815 QualType SpecConstIDTy = TemplateArgs.get (1 ).getAsType ().getCanonicalType ();
0 commit comments