From 6aae6d4961f16284fc7f49a7f7644af99b3cfb1c Mon Sep 17 00:00:00 2001 From: erichkeane Date: Wed, 3 Sep 2025 12:17:39 -0700 Subject: [PATCH] [OpenACC] Fix crash because of miscalculated dependence. We were causing ANY dependence to cause the return type of the array section to be dependent, when in reality it should only be so if one of its Bounds/Base are dependent. This patch fixes that. --- clang/lib/Sema/SemaExpr.cpp | 7 +++++-- clang/lib/Sema/SemaOpenACC.cpp | 4 ++-- .../SemaOpenACC/combined-construct-copy-clause.cpp | 3 +-- .../combined-construct-copyin-clause.cpp | 3 +-- .../combined-construct-copyout-clause.cpp | 3 +-- .../combined-construct-create-clause.cpp | 3 +-- .../combined-construct-firstprivate-clause.cpp | 3 +-- .../combined-construct-no_create-clause.cpp | 3 +-- .../combined-construct-present-clause.cpp | 3 +-- .../SemaOpenACC/compute-construct-copy-clause.cpp | 3 +-- .../compute-construct-copyin-clause.cpp | 3 +-- .../compute-construct-copyout-clause.cpp | 3 +-- .../compute-construct-create-clause.cpp | 3 +-- .../compute-construct-firstprivate-clause.cpp | 3 +-- .../compute-construct-no_create-clause.cpp | 3 +-- .../compute-construct-present-clause.cpp | 3 +-- .../compute-construct-private-clause.cpp | 14 ++++++++++++++ 17 files changed, 35 insertions(+), 32 deletions(-) diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp index 55a21aa31f0ff..317b7caec6fb7 100644 --- a/clang/lib/Sema/SemaExpr.cpp +++ b/clang/lib/Sema/SemaExpr.cpp @@ -21476,8 +21476,11 @@ ExprResult Sema::CheckPlaceholderExpr(Expr *E) { // Expressions of unknown type. case BuiltinType::ArraySection: - Diag(E->getBeginLoc(), diag::err_array_section_use) - << cast(E)->isOMPArraySection(); + // If we've already diagnosed something on the array section type, we + // shouldn't need to do any further diagnostic here. + if (!E->containsErrors()) + Diag(E->getBeginLoc(), diag::err_array_section_use) + << cast(E)->isOMPArraySection(); return ExprError(); // Expressions of unknown type. diff --git a/clang/lib/Sema/SemaOpenACC.cpp b/clang/lib/Sema/SemaOpenACC.cpp index 023be4e417fd0..5082e2c272ebd 100644 --- a/clang/lib/Sema/SemaOpenACC.cpp +++ b/clang/lib/Sema/SemaOpenACC.cpp @@ -1020,8 +1020,8 @@ ExprResult SemaOpenACC::ActOnArraySectionExpr(Expr *Base, SourceLocation LBLoc, // If any part of the expression is dependent, return a dependent sub-array. QualType ArrayExprTy = Context.ArraySectionTy; if (Base->isTypeDependent() || - (LowerBound && LowerBound->isInstantiationDependent()) || - (Length && Length->isInstantiationDependent())) + (LowerBound && LowerBound->isTypeDependent()) || + (Length && Length->isTypeDependent())) ArrayExprTy = Context.DependentTy; return new (Context) diff --git a/clang/test/SemaOpenACC/combined-construct-copy-clause.cpp b/clang/test/SemaOpenACC/combined-construct-copy-clause.cpp index 043a7ec4dc000..61c3c6ad344c5 100644 --- a/clang/test/SemaOpenACC/combined-construct-copy-clause.cpp +++ b/clang/test/SemaOpenACC/combined-construct-copy-clause.cpp @@ -47,8 +47,7 @@ void uses(int IntParam, char *PointerParam, float ArrayParam[5], Complete Compos #pragma acc parallel loop copy(ArrayParam[2:5]) for(int i = 0; i < 5; ++i); - // expected-error@+2{{OpenACC sub-array specified range [2:5] would be out of the range of the subscripted array size of 5}} - // expected-error@+1{{OpenACC variable is not a valid variable name, sub-array, array element, member of a composite variable, or composite variable member}} + // expected-error@+1{{OpenACC sub-array specified range [2:5] would be out of the range of the subscripted array size of 5}} #pragma acc parallel loop copy((float*)ArrayParam[2:5]) for(int i = 0; i < 5; ++i); // expected-error@+1{{OpenACC variable is not a valid variable name, sub-array, array element, member of a composite variable, or composite variable member}} diff --git a/clang/test/SemaOpenACC/combined-construct-copyin-clause.cpp b/clang/test/SemaOpenACC/combined-construct-copyin-clause.cpp index 9f9c2aa641c43..c300fdbd77ec2 100644 --- a/clang/test/SemaOpenACC/combined-construct-copyin-clause.cpp +++ b/clang/test/SemaOpenACC/combined-construct-copyin-clause.cpp @@ -47,8 +47,7 @@ void uses(int IntParam, char *PointerParam, float ArrayParam[5], Complete Compos #pragma acc parallel loop copyin(ArrayParam[2:5]) for(int i = 0; i < 5; ++i); - // expected-error@+2{{OpenACC sub-array specified range [2:5] would be out of the range of the subscripted array size of 5}} - // expected-error@+1{{OpenACC variable is not a valid variable name, sub-array, array element, member of a composite variable, or composite variable member}} + // expected-error@+1{{OpenACC sub-array specified range [2:5] would be out of the range of the subscripted array size of 5}} #pragma acc parallel loop copyin((float*)ArrayParam[2:5]) for(int i = 0; i < 5; ++i); // expected-error@+1{{OpenACC variable is not a valid variable name, sub-array, array element, member of a composite variable, or composite variable member}} diff --git a/clang/test/SemaOpenACC/combined-construct-copyout-clause.cpp b/clang/test/SemaOpenACC/combined-construct-copyout-clause.cpp index cc91ea4d24986..a6eed4b8844de 100644 --- a/clang/test/SemaOpenACC/combined-construct-copyout-clause.cpp +++ b/clang/test/SemaOpenACC/combined-construct-copyout-clause.cpp @@ -47,8 +47,7 @@ void uses(int IntParam, char *PointerParam, float ArrayParam[5], Complete Compos #pragma acc parallel loop copyout(ArrayParam[2:5]) for(int i = 0; i < 5; ++i); - // expected-error@+2{{OpenACC sub-array specified range [2:5] would be out of the range of the subscripted array size of 5}} - // expected-error@+1{{OpenACC variable is not a valid variable name, sub-array, array element, member of a composite variable, or composite variable member}} + // expected-error@+1{{OpenACC sub-array specified range [2:5] would be out of the range of the subscripted array size of 5}} #pragma acc parallel loop copyout((float*)ArrayParam[2:5]) for(int i = 0; i < 5; ++i); // expected-error@+1{{OpenACC variable is not a valid variable name, sub-array, array element, member of a composite variable, or composite variable member}} diff --git a/clang/test/SemaOpenACC/combined-construct-create-clause.cpp b/clang/test/SemaOpenACC/combined-construct-create-clause.cpp index 0c8f90eab3d08..c72c9b135d5cd 100644 --- a/clang/test/SemaOpenACC/combined-construct-create-clause.cpp +++ b/clang/test/SemaOpenACC/combined-construct-create-clause.cpp @@ -48,8 +48,7 @@ void uses(int IntParam, char *PointerParam, float ArrayParam[5], Complete Compos #pragma acc parallel loop create(ArrayParam[2:5]) for(int i = 0; i < 5; ++i); - // expected-error@+2{{OpenACC sub-array specified range [2:5] would be out of the range of the subscripted array size of 5}} - // expected-error@+1{{OpenACC variable is not a valid variable name, sub-array, array element, member of a composite variable, or composite variable member}} + // expected-error@+1{{OpenACC sub-array specified range [2:5] would be out of the range of the subscripted array size of 5}} #pragma acc parallel loop create((float*)ArrayParam[2:5]) for(int i = 0; i < 5; ++i); // expected-error@+1{{OpenACC variable is not a valid variable name, sub-array, array element, member of a composite variable, or composite variable member}} diff --git a/clang/test/SemaOpenACC/combined-construct-firstprivate-clause.cpp b/clang/test/SemaOpenACC/combined-construct-firstprivate-clause.cpp index 1b888ae4c6b58..85bc3a2f0124d 100644 --- a/clang/test/SemaOpenACC/combined-construct-firstprivate-clause.cpp +++ b/clang/test/SemaOpenACC/combined-construct-firstprivate-clause.cpp @@ -48,8 +48,7 @@ void uses(int IntParam, char *PointerParam, float ArrayParam[5], Complete Compos #pragma acc parallel loop firstprivate(ArrayParam[2:5]) for (int i = 5; i < 10; ++i); - // expected-error@+2{{OpenACC sub-array specified range [2:5] would be out of the range of the subscripted array size of 5}} - // expected-error@+1{{OpenACC variable is not a valid variable name, sub-array, array element, member of a composite variable, or composite variable member}} + // expected-error@+1{{OpenACC sub-array specified range [2:5] would be out of the range of the subscripted array size of 5}} #pragma acc serial loop firstprivate((float*)ArrayParam[2:5]) for (int i = 5; i < 10; ++i); // expected-error@+1{{OpenACC variable is not a valid variable name, sub-array, array element, member of a composite variable, or composite variable member}} diff --git a/clang/test/SemaOpenACC/combined-construct-no_create-clause.cpp b/clang/test/SemaOpenACC/combined-construct-no_create-clause.cpp index f01c46e4877f7..e8b6b6ed5a385 100644 --- a/clang/test/SemaOpenACC/combined-construct-no_create-clause.cpp +++ b/clang/test/SemaOpenACC/combined-construct-no_create-clause.cpp @@ -47,8 +47,7 @@ void uses(int IntParam, char *PointerParam, float ArrayParam[5], Complete Compos #pragma acc parallel loop no_create(ArrayParam[2:5]) for (unsigned i = 0; i < 5; ++i); - // expected-error@+2{{OpenACC sub-array specified range [2:5] would be out of the range of the subscripted array size of 5}} - // expected-error@+1{{OpenACC variable is not a valid variable name, sub-array, array element, member of a composite variable, or composite variable member}} + // expected-error@+1{{OpenACC sub-array specified range [2:5] would be out of the range of the subscripted array size of 5}} #pragma acc parallel loop no_create((float*)ArrayParam[2:5]) for (unsigned i = 0; i < 5; ++i); // expected-error@+1{{OpenACC variable is not a valid variable name, sub-array, array element, member of a composite variable, or composite variable member}} diff --git a/clang/test/SemaOpenACC/combined-construct-present-clause.cpp b/clang/test/SemaOpenACC/combined-construct-present-clause.cpp index 814acf25c01c0..64d171bcaa26e 100644 --- a/clang/test/SemaOpenACC/combined-construct-present-clause.cpp +++ b/clang/test/SemaOpenACC/combined-construct-present-clause.cpp @@ -47,8 +47,7 @@ void uses(int IntParam, char *PointerParam, float ArrayParam[5], Complete Compos #pragma acc parallel loop present(ArrayParam[2:5]) for(unsigned I = 0; I < 5; ++I); - // expected-error@+2{{OpenACC sub-array specified range [2:5] would be out of the range of the subscripted array size of 5}} - // expected-error@+1{{OpenACC variable is not a valid variable name, sub-array, array element, member of a composite variable, or composite variable member}} + // expected-error@+1{{OpenACC sub-array specified range [2:5] would be out of the range of the subscripted array size of 5}} #pragma acc parallel loop present((float*)ArrayParam[2:5]) for(unsigned I = 0; I < 5; ++I); // expected-error@+1{{OpenACC variable is not a valid variable name, sub-array, array element, member of a composite variable, or composite variable member}} diff --git a/clang/test/SemaOpenACC/compute-construct-copy-clause.cpp b/clang/test/SemaOpenACC/compute-construct-copy-clause.cpp index 2797927e6e56b..eb35a21f2619e 100644 --- a/clang/test/SemaOpenACC/compute-construct-copy-clause.cpp +++ b/clang/test/SemaOpenACC/compute-construct-copy-clause.cpp @@ -47,8 +47,7 @@ void uses(int IntParam, char *PointerParam, float ArrayParam[5], Complete Compos #pragma acc parallel copy(ArrayParam[2:5]) while(1); - // expected-error@+2{{OpenACC sub-array specified range [2:5] would be out of the range of the subscripted array size of 5}} - // expected-error@+1{{OpenACC variable is not a valid variable name, sub-array, array element, member of a composite variable, or composite variable member}} + // expected-error@+1{{OpenACC sub-array specified range [2:5] would be out of the range of the subscripted array size of 5}} #pragma acc parallel copy((float*)ArrayParam[2:5]) while(1); // expected-error@+1{{OpenACC variable is not a valid variable name, sub-array, array element, member of a composite variable, or composite variable member}} diff --git a/clang/test/SemaOpenACC/compute-construct-copyin-clause.cpp b/clang/test/SemaOpenACC/compute-construct-copyin-clause.cpp index 74ce74a1368d1..8897e46132177 100644 --- a/clang/test/SemaOpenACC/compute-construct-copyin-clause.cpp +++ b/clang/test/SemaOpenACC/compute-construct-copyin-clause.cpp @@ -47,8 +47,7 @@ void uses(int IntParam, char *PointerParam, float ArrayParam[5], Complete Compos #pragma acc parallel copyin(ArrayParam[2:5]) while(1); - // expected-error@+2{{OpenACC sub-array specified range [2:5] would be out of the range of the subscripted array size of 5}} - // expected-error@+1{{OpenACC variable is not a valid variable name, sub-array, array element, member of a composite variable, or composite variable member}} + // expected-error@+1{{OpenACC sub-array specified range [2:5] would be out of the range of the subscripted array size of 5}} #pragma acc parallel copyin((float*)ArrayParam[2:5]) while(1); // expected-error@+1{{OpenACC variable is not a valid variable name, sub-array, array element, member of a composite variable, or composite variable member}} diff --git a/clang/test/SemaOpenACC/compute-construct-copyout-clause.cpp b/clang/test/SemaOpenACC/compute-construct-copyout-clause.cpp index c01dc1a39963b..fae89b7d7207c 100644 --- a/clang/test/SemaOpenACC/compute-construct-copyout-clause.cpp +++ b/clang/test/SemaOpenACC/compute-construct-copyout-clause.cpp @@ -47,8 +47,7 @@ void uses(int IntParam, char *PointerParam, float ArrayParam[5], Complete Compos #pragma acc parallel copyout(ArrayParam[2:5]) while(1); - // expected-error@+2{{OpenACC sub-array specified range [2:5] would be out of the range of the subscripted array size of 5}} - // expected-error@+1{{OpenACC variable is not a valid variable name, sub-array, array element, member of a composite variable, or composite variable member}} + // expected-error@+1{{OpenACC sub-array specified range [2:5] would be out of the range of the subscripted array size of 5}} #pragma acc parallel copyout((float*)ArrayParam[2:5]) while(1); // expected-error@+1{{OpenACC variable is not a valid variable name, sub-array, array element, member of a composite variable, or composite variable member}} diff --git a/clang/test/SemaOpenACC/compute-construct-create-clause.cpp b/clang/test/SemaOpenACC/compute-construct-create-clause.cpp index 3ed1e1e9f700d..7d8878552b28b 100644 --- a/clang/test/SemaOpenACC/compute-construct-create-clause.cpp +++ b/clang/test/SemaOpenACC/compute-construct-create-clause.cpp @@ -47,8 +47,7 @@ void uses(int IntParam, char *PointerParam, float ArrayParam[5], Complete Compos #pragma acc parallel create(ArrayParam[2:5]) while(1); - // expected-error@+2{{OpenACC sub-array specified range [2:5] would be out of the range of the subscripted array size of 5}} - // expected-error@+1{{OpenACC variable is not a valid variable name, sub-array, array element, member of a composite variable, or composite variable member}} + // expected-error@+1{{OpenACC sub-array specified range [2:5] would be out of the range of the subscripted array size of 5}} #pragma acc parallel create((float*)ArrayParam[2:5]) while(1); // expected-error@+1{{OpenACC variable is not a valid variable name, sub-array, array element, member of a composite variable, or composite variable member}} diff --git a/clang/test/SemaOpenACC/compute-construct-firstprivate-clause.cpp b/clang/test/SemaOpenACC/compute-construct-firstprivate-clause.cpp index 4bee51530f44a..eab8629904eb5 100644 --- a/clang/test/SemaOpenACC/compute-construct-firstprivate-clause.cpp +++ b/clang/test/SemaOpenACC/compute-construct-firstprivate-clause.cpp @@ -48,8 +48,7 @@ void uses(int IntParam, char *PointerParam, float ArrayParam[5], Complete Compos #pragma acc parallel firstprivate(ArrayParam[2:5]) while(1); - // expected-error@+2{{OpenACC sub-array specified range [2:5] would be out of the range of the subscripted array size of 5}} - // expected-error@+1{{OpenACC variable is not a valid variable name, sub-array, array element, member of a composite variable, or composite variable member}} + // expected-error@+1{{OpenACC sub-array specified range [2:5] would be out of the range of the subscripted array size of 5}} #pragma acc parallel firstprivate((float*)ArrayParam[2:5]) while(1); // expected-error@+1{{OpenACC variable is not a valid variable name, sub-array, array element, member of a composite variable, or composite variable member}} diff --git a/clang/test/SemaOpenACC/compute-construct-no_create-clause.cpp b/clang/test/SemaOpenACC/compute-construct-no_create-clause.cpp index fa84b1fbeda07..9f9f1a93ad12e 100644 --- a/clang/test/SemaOpenACC/compute-construct-no_create-clause.cpp +++ b/clang/test/SemaOpenACC/compute-construct-no_create-clause.cpp @@ -47,8 +47,7 @@ void uses(int IntParam, char *PointerParam, float ArrayParam[5], Complete Compos #pragma acc parallel no_create(ArrayParam[2:5]) while(1); - // expected-error@+2{{OpenACC sub-array specified range [2:5] would be out of the range of the subscripted array size of 5}} - // expected-error@+1{{OpenACC variable is not a valid variable name, sub-array, array element, member of a composite variable, or composite variable member}} + // expected-error@+1{{OpenACC sub-array specified range [2:5] would be out of the range of the subscripted array size of 5}} #pragma acc parallel no_create((float*)ArrayParam[2:5]) while(1); // expected-error@+1{{OpenACC variable is not a valid variable name, sub-array, array element, member of a composite variable, or composite variable member}} diff --git a/clang/test/SemaOpenACC/compute-construct-present-clause.cpp b/clang/test/SemaOpenACC/compute-construct-present-clause.cpp index db230d0b1d9da..2dedc611a85cd 100644 --- a/clang/test/SemaOpenACC/compute-construct-present-clause.cpp +++ b/clang/test/SemaOpenACC/compute-construct-present-clause.cpp @@ -47,8 +47,7 @@ void uses(int IntParam, char *PointerParam, float ArrayParam[5], Complete Compos #pragma acc parallel present(ArrayParam[2:5]) while(1); - // expected-error@+2{{OpenACC sub-array specified range [2:5] would be out of the range of the subscripted array size of 5}} - // expected-error@+1{{OpenACC variable is not a valid variable name, sub-array, array element, member of a composite variable, or composite variable member}} + // expected-error@+1{{OpenACC sub-array specified range [2:5] would be out of the range of the subscripted array size of 5}} #pragma acc parallel present((float*)ArrayParam[2:5]) while(1); // expected-error@+1{{OpenACC variable is not a valid variable name, sub-array, array element, member of a composite variable, or composite variable member}} diff --git a/clang/test/SemaOpenACC/compute-construct-private-clause.cpp b/clang/test/SemaOpenACC/compute-construct-private-clause.cpp index fb9e89a21accb..88f0a684730c5 100644 --- a/clang/test/SemaOpenACC/compute-construct-private-clause.cpp +++ b/clang/test/SemaOpenACC/compute-construct-private-clause.cpp @@ -158,3 +158,17 @@ void Inst() { TemplUses(i, Arr, C); // #TEMPL_USES_INST NTTP<5, NTTP_REFed>(); // #NTTP_INST } + +template +void ThisCrashed(unsigned A, unsigned B) { + T ***ThreePtr; + // expected-error@+1 2{{OpenACC sub-array length is unspecified and cannot be inferred because the subscripted value is not an array}} +#pragma acc parallel private(ThreePtr[A:B][B][B]) + ; +} + +void inst_crash() { + // expected-note@+1{{in instantiation}} + ThisCrashed(1, 2); +} +