Author: Tadeusz
Date: 2026-09-10T08:12:08+08:00
New Revision: 2f704c94bf5c396f33da4684540cb22f38a757cc

URL: 
https://github.com/llvm/llvm-project/commit/2f704c94bf5c396f33da4684540cb22f38a757cc
DIFF: 
https://github.com/llvm/llvm-project/commit/2f704c94bf5c396f33da4684540cb22f38a757cc.diff

LOG: [Clang][OpenACC] Fixed getExtValue Call on Invalid Gang Dim (#221502)

**Problem**
When an invalid 'gang dim' value is used in `CheckGangDimExpr`, the
function prints the value into the diagnostic message by calling
`getExtValue`. This function asserts on values that can't fit into a
signed integer.

**Solution**
`APSInt` has a `<<` operator anyway so just use that.


The fix causes the message to print with the following formatting: 
```
test.cpp:5:40: error: argument to 'gang' clause dimension must be 1, 2, or 3: 
evaluated to 18'446'744'073'709'551'574
    5 | #pragma acc routine(S::foo) gang(dim : S::foo())
      |                                        ^
1 warning and 1 error generated.
```
Fixes #221418

Added: 
    

Modified: 
    clang/docs/ReleaseNotes.md
    clang/lib/Sema/SemaOpenACCClause.cpp
    clang/test/SemaOpenACC/routine-construct-clauses.cpp

Removed: 
    


################################################################################
diff  --git a/clang/docs/ReleaseNotes.md b/clang/docs/ReleaseNotes.md
index 92d30d347107d..0f6b4141811f8 100644
--- a/clang/docs/ReleaseNotes.md
+++ b/clang/docs/ReleaseNotes.md
@@ -703,6 +703,9 @@ features cannot lower the translation-unit ABI level;
   `this` via a member access through a dependent base class.
 - Fixed `DiagnoseUnguardedAvailability::TraverseIfStmt` dereferencing a nullptr
   on `if consteval {}`. (#GH220004)
+- Fixed an assertion when the `dim` argument to an OpenACC `gang` clause
+  evaluated to a value not representable by a signed integer, such as an
+  unsigned wrap around. (#GH221418)
 
 ### OpenACC Specific Changes
 

diff  --git a/clang/lib/Sema/SemaOpenACCClause.cpp 
b/clang/lib/Sema/SemaOpenACCClause.cpp
index 0409e2456895d..ad6fbf6f7bb52 100644
--- a/clang/lib/Sema/SemaOpenACCClause.cpp
+++ b/clang/lib/Sema/SemaOpenACCClause.cpp
@@ -1159,7 +1159,7 @@ ExprResult CheckGangDimExpr(SemaOpenACC &S, Expr *E) {
 
   if (!ICE || *ICE <= 0 || ICE > 3) {
     S.Diag(Res.get()->getBeginLoc(), diag::err_acc_gang_dim_value)
-        << ICE.has_value() << ICE.value_or(llvm::APSInt{}).getExtValue();
+        << ICE.has_value() << ICE.value_or(llvm::APSInt{});
     return ExprError();
   }
 
@@ -2045,7 +2045,7 @@ ExprResult SemaOpenACC::CheckTileSizeExpr(Expr *SizeExpr) 
{
   // where each tile size is a constant positive integer expression or 
asterisk.
   if (!ICE || *ICE <= 0) {
     Diag(SizeExpr->getBeginLoc(), diag::err_acc_size_expr_value)
-        << ICE.has_value() << ICE.value_or(llvm::APSInt{}).getExtValue();
+        << ICE.has_value() << ICE.value_or(llvm::APSInt{});
     return ExprError();
   }
 
@@ -2073,7 +2073,7 @@ ExprResult SemaOpenACC::CheckCollapseLoopCount(Expr 
*LoopCount) {
   // expression.
   if (!ICE || *ICE <= 0) {
     Diag(LoopCount->getBeginLoc(), diag::err_acc_collapse_loop_count)
-        << ICE.has_value() << ICE.value_or(llvm::APSInt{}).getExtValue();
+        << ICE.has_value() << ICE.value_or(llvm::APSInt{});
     return ExprError();
   }
 

diff  --git a/clang/test/SemaOpenACC/routine-construct-clauses.cpp 
b/clang/test/SemaOpenACC/routine-construct-clauses.cpp
index 4c7152861afc1..44ace61b08823 100644
--- a/clang/test/SemaOpenACC/routine-construct-clauses.cpp
+++ b/clang/test/SemaOpenACC/routine-construct-clauses.cpp
@@ -103,6 +103,7 @@ static constexpr int One() { return 1; }
 static constexpr int Two() { return 2; }
 static constexpr int Three() { return 3; }
 static constexpr int Four() { return 4; }
+static constexpr unsigned long LargeUnsigned() { return -42; }
 };
 // 'dim' must be 1, 2, or 3.
 // expected-error@+1{{argument to 'gang' clause dimension must be 1, 2, or 3: 
evaluated to -5}}
@@ -114,6 +115,8 @@ static constexpr int Four() { return 4; }
 #pragma acc routine(Func) gang(dim:HasFuncs::Three())
 // expected-error@+1{{argument to 'gang' clause dimension must be 1, 2, or 3: 
evaluated to 4}}
 #pragma acc routine(Func) gang(dim:HasFuncs::Four())
+// expected-error-re@+1{{argument to 'gang' clause dimension must be 1, 2, or 
3: evaluated to {{.*}}}}
+#pragma acc routine(Func) gang(dim:HasFuncs::LargeUnsigned())
 
 template<typename T>
 struct DependentT {


        
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to