Skip to content

Commit 4e81c90

Browse files
committed
Forbid dependencies over call expressions.
Closes llvm#54 Closes llvm#55
1 parent 8788376 commit 4e81c90

File tree

7 files changed

+66
-4
lines changed

7 files changed

+66
-4
lines changed

clang/include/clang/Basic/DiagnosticSemaKinds.td

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10888,6 +10888,8 @@ def err_oss_clause_not_arithmetic_type_arg : Error<
1088810888
def err_oss_reduction_depend_conflict : Error<
1088910889
"variable %0 conflicts between dependency and reduction clause">;
1089010890

10891+
def err_oss_call_expr_support : Error<
10892+
"call expressions are not supported">;
1089110893
def err_oss_expected_addressable_lvalue_or_array_item : Error<
1089210894
"expected addressable lvalue expression, array element, array shape or array section">;
1089310895
def err_oss_expected_dereference_or_array_item : Error<

clang/lib/Sema/SemaOmpSs.cpp

Lines changed: 48 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3280,14 +3280,61 @@ Sema::ActOnOmpSsDependClause(ArrayRef<OmpSsDependClauseKind> DepKinds, SourceLoc
32803280
// typedef float V __attribute__((vector_size(16)));
32813281
// V a;
32823282
// #pragma oss task in(a[3])
3283-
if (!RefExpr->IgnoreParenImpCasts()->isLValue() ||
3283+
// and functions:
3284+
// void foo() { #pragma oss task in(foo) {} }
3285+
if (RefExpr->IgnoreParenImpCasts()->getType()->isFunctionType() ||
3286+
!RefExpr->IgnoreParenImpCasts()->isLValue() ||
32843287
(ASE &&
32853288
!ASE->getBase()->getType().getNonReferenceType()->isPointerType() &&
32863289
!ASE->getBase()->getType().getNonReferenceType()->isArrayType())) {
32873290
Diag(ELoc, diag::err_oss_expected_addressable_lvalue_or_array_item)
32883291
<< RefExpr->getSourceRange();
32893292
continue;
32903293
}
3294+
3295+
class CheckCallExpr
3296+
: public ConstStmtVisitor<CheckCallExpr, bool> {
3297+
// This Visitor checks the base of the
3298+
// dependency is over a CallExpr, which is error.
3299+
// int *get();
3300+
// auto l = []() -> int * {...};
3301+
// #pragma oss task in(get()[1], l()[3])
3302+
public:
3303+
bool VisitOSSMultiDepExpr(const OSSMultiDepExpr *E) {
3304+
return Visit(E->getDepExpr());
3305+
}
3306+
3307+
bool VisitOSSArrayShapingExpr(const OSSArrayShapingExpr *E) {
3308+
return Visit(E->getBase());
3309+
}
3310+
3311+
bool VisitOSSArraySectionExpr(const OSSArraySectionExpr *E) {
3312+
return Visit(E->getBase());
3313+
}
3314+
3315+
bool VisitArraySubscriptExpr(const ArraySubscriptExpr *E) {
3316+
return Visit(E->getBase());
3317+
}
3318+
3319+
bool VisitUnaryOperator(const UnaryOperator *E) {
3320+
return Visit(E->getSubExpr());
3321+
}
3322+
3323+
bool VisitMemberExpr(const MemberExpr *E) {
3324+
return Visit(E->getBase());
3325+
}
3326+
3327+
bool VisitCallExpr(const CallExpr *E) {
3328+
return true;
3329+
}
3330+
};
3331+
CheckCallExpr CCE;
3332+
if (CCE.Visit(RefExpr)) {
3333+
Diag(ELoc, diag::err_oss_call_expr_support)
3334+
<< RefExpr->getSourceRange();
3335+
continue;
3336+
}
3337+
32913338
bool InvalidArraySection = false;
32923339
while (auto *OASE = dyn_cast<OSSArraySectionExpr>(SimpleExpr)) {
32933340
if (!OASE->isColonForm() && !OSSSyntax) {

clang/test/OmpSs/Sema/release_depend.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ int main(int argc, char **argv, char *env[]) {
3838
#pragma oss release depend (in : vec[1]) // expected-error {{expected addressable lvalue expression, array element, array shape or array section}}
3939
#pragma oss release depend (in : argv[0])
4040
#pragma oss release depend (in : ) // expected-error {{expected expression}}
41-
#pragma oss release depend (in : main)
41+
#pragma oss release depend (in : main) // expected-error {{expected addressable lvalue expression, array element, array shape or array section}}
4242
#pragma oss release depend(in : a[0]) // expected-error{{expected addressable lvalue expression, array element, array shape or array section}}
4343
#pragma oss release depend (in : argv[ // expected-error {{expected expression}} expected-error {{expected ']'}} expected-error {{expected ')'}} expected-note {{to match this '['}} expected-note {{to match this '('}}
4444
#pragma oss release depend (in : argv[: // expected-error {{expected expression}} expected-error {{expected ']'}} expected-error {{expected ')'}} expected-note {{to match this '['}} expected-note {{to match this '('}}

clang/test/OmpSs/Sema/task_depend.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ int main(int argc, char **argv, char *env[]) {
3838
#pragma oss task depend (in : vec[1]) // expected-error {{expected addressable lvalue expression, array element, array shape or array section}}
3939
#pragma oss task depend (in : argv[0])
4040
#pragma oss task depend (in : ) // expected-error {{expected expression}}
41-
#pragma oss task depend (in : main)
41+
#pragma oss task depend (in : main) // expected-error {{expected addressable lvalue expression, array element, array shape or array section}}
4242
#pragma oss task depend(in : a[0]) // expected-error{{expected addressable lvalue expression, array element, array shape or array section}}
4343
#pragma oss task depend (in : argv[ // expected-error {{expected expression}} expected-error {{expected ']'}} expected-error {{expected ')'}} expected-note {{to match this '['}} expected-note {{to match this '('}}
4444
#pragma oss task depend (in : argv[: // expected-error {{expected expression}} expected-error {{expected ']'}} expected-error {{expected ')'}} expected-note {{to match this '['}} expected-note {{to match this '('}}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
// RUN: %clang_cc1 -verify -fompss-2 -x c++ -ferror-limit 100 -o - %s
2+
// RUN: %clang_cc1 -verify -fompss-2 -x c -ferror-limit 100 -o - %s
3+
int *get();
4+
int main() {
5+
#pragma oss task in(get()[3]) // expected-error {{call expressions are not supported}}
6+
{}
7+
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
// RUN: %clang_cc1 -verify -fompss-2 -x c++ -fexceptions -fcxx-exceptions %s -Wuninitialized
2+
int main() {
3+
auto l = []() -> int * { return nullptr; };
4+
#pragma oss task in(l()[30]) // expected-error {{call expressions are not supported}}
5+
{}
6+
}

clang/test/OmpSs/Sema/task_oss_depend.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ int main(int argc, char **argv, char *env[]) {
3434
#pragma oss task in(argv[1][1] = '2')
3535
#pragma oss task in (vec[1]) // expected-error {{expected addressable lvalue expression, array element, array shape or array section}}
3636
#pragma oss task in (argv[0])
37-
#pragma oss task in (main)
37+
#pragma oss task in (main) // expected-error {{expected addressable lvalue expression, array element, array shape or array section}}
3838
#pragma oss task in (a[0]) // expected-error{{expected addressable lvalue expression, array element, array shape or array section}}
3939
#pragma oss task in (argv[ // expected-error {{expected expression}} expected-error {{expected ']'}} expected-error {{expected ')'}} expected-note {{to match this '['}} expected-note {{to match this '('}}
4040
#pragma oss task in (argv[: // expected-error {{expected expression}} expected-error {{expected ']'}} expected-error {{expected ')'}} expected-note {{to match this '['}} expected-note {{to match this '('}}

0 commit comments

Comments
 (0)