llvmbot wrote:

<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-clang

Author: Florian Hahn (fhahn)

<details>
<summary>Changes</summary>

As per [1] the indices for a matrix element access operator shall have integral 
or unscoped enumeration types and be non-negative. At the moment, the index 
expression is converted to SizeType irrespective of the signedness of the index 
expression. This causes implicit sign conversion warnings if any of the indices 
is signed.

As per the spec, using signed types as indices is allowed and should not cause 
any warnings. If the index expression is signed, extend to SignedSizeType to 
avoid the warning.

[1] 
https://clang.llvm.org/docs/MatrixTypes.html#matrix-type-element-access-operator

---
Full diff: https://github.com/llvm/llvm-project/pull/103044.diff


2 Files Affected:

- (modified) clang/lib/Sema/SemaExpr.cpp (+4-2) 
- (modified) clang/test/SemaCXX/matrix-index-operator-sign-conversion.cpp 
(+2-5) 


``````````diff
diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp
index 8defc8e1c185c0..e2c620f0260140 100644
--- a/clang/lib/Sema/SemaExpr.cpp
+++ b/clang/lib/Sema/SemaExpr.cpp
@@ -5021,8 +5021,10 @@ ExprResult Sema::CreateBuiltinMatrixSubscriptExpr(Expr 
*Base, Expr *RowIdx,
       }
     }
 
-    ExprResult ConvExpr =
-        tryConvertExprToType(IndexExpr, Context.getSizeType());
+    ExprResult ConvExpr = tryConvertExprToType(
+        IndexExpr, IndexExpr->getType()->isSignedIntegerType()
+                       ? Context.getSignedSizeType()
+                       : Context.getSizeType());
     assert(!ConvExpr.isInvalid() &&
            "should be able to convert any integer type to size type");
     return ConvExpr.get();
diff --git a/clang/test/SemaCXX/matrix-index-operator-sign-conversion.cpp 
b/clang/test/SemaCXX/matrix-index-operator-sign-conversion.cpp
index 4254780651c5f5..e6fe4a6c57ff22 100644
--- a/clang/test/SemaCXX/matrix-index-operator-sign-conversion.cpp
+++ b/clang/test/SemaCXX/matrix-index-operator-sign-conversion.cpp
@@ -2,19 +2,16 @@
 
 template <typename T, int R, int C> using m 
__attribute__((__matrix_type__(R,C))) = T;
 
-// FIXME: should not warn here.
 double index1(m<double,3,1> X, int      i) { return X[i][0]; }
-// expected-warning@-1 {{implicit conversion changes signedness: 'int' to 
'unsigned long'}}
 
 double index2(m<double,3,1> X, unsigned i) { return X[i][0]; }
 
 double index3(m<double,3,1> X, char     i) { return X[i][0]; }
-// expected-warning@-1 {{implicit conversion changes signedness: 'char' to 
'unsigned long'}}
 
 double index4(m<double,3,1> X, int      i) { return X[0][i]; }
-// expected-warning@-1 {{implicit conversion changes signedness: 'int' to 
'unsigned long'}}
 
 double index5(m<double,3,1> X, unsigned i) { return X[0][i]; }
 
 double index6(m<double,3,1> X, char     i) { return X[0][i]; }
-// expected-warning@-1 {{implicit conversion changes signedness: 'char' to 
'unsigned long'}}
+
+// expected-no-diagnostics

``````````

</details>


https://github.com/llvm/llvm-project/pull/103044
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to