@@ -76,10 +76,16 @@ static Attr *handleSuppressAttr(Sema &S, Stmt *St, const ParsedAttr &A,
76
76
}
77
77
78
78
template <typename FPGALoopAttrT>
79
- static Attr *handleIntelFPGALoopAttr (Sema &S, const ParsedAttr &A) {
79
+ static Attr *handleIntelFPGALoopAttr (Sema &S, Stmt *St, const ParsedAttr &A) {
80
80
if (S.LangOpts .SYCLIsHost )
81
81
return nullptr ;
82
82
83
+ if (!isa<ForStmt, CXXForRangeStmt, DoStmt, WhileStmt>(St)) {
84
+ S.Diag (A.getLoc (), diag::err_attribute_wrong_decl_type_str)
85
+ << A << " 'for', 'while', and 'do' statements" ;
86
+ return nullptr ;
87
+ }
88
+
83
89
unsigned NumArgs = A.getNumArgs ();
84
90
if (NumArgs > 1 ) {
85
91
S.Diag (A.getLoc (), diag::warn_attribute_too_many_arguments) << A << 1 ;
@@ -104,10 +110,16 @@ static Attr *handleIntelFPGALoopAttr(Sema &S, const ParsedAttr &A) {
104
110
105
111
template <>
106
112
Attr *handleIntelFPGALoopAttr<SYCLIntelFPGADisableLoopPipeliningAttr>(
107
- Sema &S, const ParsedAttr &A) {
113
+ Sema &S, Stmt *St, const ParsedAttr &A) {
108
114
if (S.LangOpts .SYCLIsHost )
109
115
return nullptr ;
110
116
117
+ if (!isa<ForStmt, CXXForRangeStmt, DoStmt, WhileStmt>(St)) {
118
+ S.Diag (A.getLoc (), diag::err_attribute_wrong_decl_type_str)
119
+ << A << " 'for', 'while', and 'do' statements" ;
120
+ return nullptr ;
121
+ }
122
+
111
123
unsigned NumArgs = A.getNumArgs ();
112
124
if (NumArgs > 0 ) {
113
125
S.Diag (A.getLoc (), diag::warn_attribute_too_many_arguments) << A << 0 ;
@@ -270,7 +282,13 @@ CheckRedundantSYCLIntelFPGAIVDepAttrs(Sema &S, ArrayRef<const Attr *> Attrs) {
270
282
}
271
283
}
272
284
273
- static Attr *handleIntelFPGAIVDepAttr (Sema &S, const ParsedAttr &A) {
285
+ static Attr *handleIntelFPGAIVDepAttr (Sema &S, Stmt *St, const ParsedAttr &A) {
286
+ if (!isa<ForStmt, CXXForRangeStmt, DoStmt, WhileStmt>(St)) {
287
+ S.Diag (A.getLoc (), diag::err_attribute_wrong_decl_type_str)
288
+ << A << " 'for', 'while', and 'do' statements" ;
289
+ return nullptr ;
290
+ }
291
+
274
292
unsigned NumArgs = A.getNumArgs ();
275
293
if (NumArgs > 2 ) {
276
294
S.Diag (A.getLoc (), diag::err_attribute_too_many_arguments) << A << 2 ;
@@ -284,10 +302,17 @@ static Attr *handleIntelFPGAIVDepAttr(Sema &S, const ParsedAttr &A) {
284
302
NumArgs == 2 ? A.getArgAsExpr (1 ) : nullptr );
285
303
}
286
304
287
- static Attr *handleIntelFPGANofusionAttr (Sema &S, const ParsedAttr &A) {
305
+ static Attr *handleIntelFPGANofusionAttr (Sema &S, Stmt *St,
306
+ const ParsedAttr &A) {
288
307
if (S.LangOpts .SYCLIsHost )
289
308
return nullptr ;
290
309
310
+ if (!isa<ForStmt, CXXForRangeStmt, DoStmt, WhileStmt>(St)) {
311
+ S.Diag (A.getLoc (), diag::err_attribute_wrong_decl_type_str)
312
+ << A << " 'for', 'while', and 'do' statements" ;
313
+ return nullptr ;
314
+ }
315
+
291
316
unsigned NumArgs = A.getNumArgs ();
292
317
if (NumArgs > 0 ) {
293
318
S.Diag (A.getLoc (), diag::warn_attribute_too_many_arguments) << A << 0 ;
@@ -751,8 +776,17 @@ static Attr *handleLoopUnrollHint(Sema &S, Stmt *St, const ParsedAttr &A,
751
776
Expr *E = NumArgs ? A.getArgAsExpr (0 ) : nullptr ;
752
777
if (A.getParsedKind () == ParsedAttr::AT_OpenCLUnrollHint)
753
778
return S.BuildOpenCLLoopUnrollHintAttr (A, E);
754
- else if (A.getParsedKind () == ParsedAttr::AT_LoopUnrollHint)
779
+ else if (A.getParsedKind () == ParsedAttr::AT_LoopUnrollHint) {
780
+ // FIXME: this should be hoisted up to the top level, but can't be placed
781
+ // there until the opencl attribute has its parsing error converted into a
782
+ // semantic error. See: Parser::ParseOpenCLUnrollHintAttribute().
783
+ if (!isa<ForStmt, CXXForRangeStmt, DoStmt, WhileStmt>(St)) {
784
+ S.Diag (A.getLoc (), diag::err_attribute_wrong_decl_type_str)
785
+ << A << " 'for', 'while', and 'do' statements" ;
786
+ return nullptr ;
787
+ }
755
788
return S.BuildLoopUnrollHintAttr (A, E);
789
+ }
756
790
757
791
return nullptr ;
758
792
}
@@ -771,20 +805,22 @@ static Attr *ProcessStmtAttribute(Sema &S, Stmt *St, const ParsedAttr &A,
771
805
case ParsedAttr::AT_LoopHint:
772
806
return handleLoopHintAttr (S, St, A, Range);
773
807
case ParsedAttr::AT_SYCLIntelFPGAIVDep:
774
- return handleIntelFPGAIVDepAttr (S, A);
808
+ return handleIntelFPGAIVDepAttr (S, St, A);
775
809
case ParsedAttr::AT_SYCLIntelFPGAInitiationInterval:
776
- return handleIntelFPGALoopAttr<SYCLIntelFPGAInitiationIntervalAttr>(S, A);
810
+ return handleIntelFPGALoopAttr<SYCLIntelFPGAInitiationIntervalAttr>(S, St,
811
+ A);
777
812
case ParsedAttr::AT_SYCLIntelFPGAMaxConcurrency:
778
- return handleIntelFPGALoopAttr<SYCLIntelFPGAMaxConcurrencyAttr>(S, A);
813
+ return handleIntelFPGALoopAttr<SYCLIntelFPGAMaxConcurrencyAttr>(S, St, A);
779
814
case ParsedAttr::AT_SYCLIntelFPGALoopCoalesce:
780
- return handleIntelFPGALoopAttr<SYCLIntelFPGALoopCoalesceAttr>(S, A);
815
+ return handleIntelFPGALoopAttr<SYCLIntelFPGALoopCoalesceAttr>(S, St, A);
781
816
case ParsedAttr::AT_SYCLIntelFPGADisableLoopPipelining:
782
- return handleIntelFPGALoopAttr<SYCLIntelFPGADisableLoopPipeliningAttr>(S,
783
- A);
817
+ return handleIntelFPGALoopAttr<SYCLIntelFPGADisableLoopPipeliningAttr>(
818
+ S, St, A);
784
819
case ParsedAttr::AT_SYCLIntelFPGAMaxInterleaving:
785
- return handleIntelFPGALoopAttr<SYCLIntelFPGAMaxInterleavingAttr>(S, A);
820
+ return handleIntelFPGALoopAttr<SYCLIntelFPGAMaxInterleavingAttr>(S, St, A);
786
821
case ParsedAttr::AT_SYCLIntelFPGASpeculatedIterations:
787
- return handleIntelFPGALoopAttr<SYCLIntelFPGASpeculatedIterationsAttr>(S, A);
822
+ return handleIntelFPGALoopAttr<SYCLIntelFPGASpeculatedIterationsAttr>(S, St,
823
+ A);
788
824
case ParsedAttr::AT_OpenCLUnrollHint:
789
825
case ParsedAttr::AT_LoopUnrollHint:
790
826
return handleLoopUnrollHint (S, St, A, Range);
@@ -797,7 +833,7 @@ static Attr *ProcessStmtAttribute(Sema &S, Stmt *St, const ParsedAttr &A,
797
833
case ParsedAttr::AT_Unlikely:
798
834
return handleUnlikely (S, St, A, Range);
799
835
case ParsedAttr::AT_SYCLIntelFPGANofusion:
800
- return handleIntelFPGANofusionAttr (S, A);
836
+ return handleIntelFPGANofusionAttr (S, St, A);
801
837
default :
802
838
// if we're here, then we parsed a known attribute, but didn't recognize
803
839
// it as a statement attribute => it is declaration attribute
0 commit comments