diff --git a/clang/lib/CodeGen/CGExpr.cpp b/clang/lib/CodeGen/CGExpr.cpp index 48d9a3b8a5acb..426fccb721db8 100644 --- a/clang/lib/CodeGen/CGExpr.cpp +++ b/clang/lib/CodeGen/CGExpr.cpp @@ -4392,13 +4392,24 @@ LValue CodeGenFunction::EmitArraySubscriptExpr(const ArraySubscriptExpr *E, return LV; } +llvm::Value *CodeGenFunction::EmitMatrixIndexExpr(const Expr *E) { + llvm::Value *Idx = EmitScalarExpr(E); + if (Idx->getType() == IntPtrTy) + return Idx; + bool IsSigned = E->getType()->isSignedIntegerOrEnumerationType(); + return Builder.CreateIntCast(Idx, IntPtrTy, IsSigned); +} + LValue CodeGenFunction::EmitMatrixSubscriptExpr(const MatrixSubscriptExpr *E) { assert( !E->isIncomplete() && "incomplete matrix subscript expressions should be rejected during Sema"); LValue Base = EmitLValue(E->getBase()); - llvm::Value *RowIdx = EmitScalarExpr(E->getRowIdx()); - llvm::Value *ColIdx = EmitScalarExpr(E->getColumnIdx()); + + // Extend or truncate the index type to 32 or 64-bits if needed. + llvm::Value *RowIdx = EmitMatrixIndexExpr(E->getRowIdx()); + llvm::Value *ColIdx = EmitMatrixIndexExpr(E->getColumnIdx()); + llvm::Value *NumRows = Builder.getIntN( RowIdx->getType()->getScalarSizeInBits(), E->getBase()->getType()->castAs()->getNumRows()); diff --git a/clang/lib/CodeGen/CGExprScalar.cpp b/clang/lib/CodeGen/CGExprScalar.cpp index 3bda254c86adf..2a726bba2dd30 100644 --- a/clang/lib/CodeGen/CGExprScalar.cpp +++ b/clang/lib/CodeGen/CGExprScalar.cpp @@ -2007,8 +2007,8 @@ Value *ScalarExprEmitter::VisitMatrixSubscriptExpr(MatrixSubscriptExpr *E) { // Handle the vector case. The base must be a vector, the index must be an // integer value. - Value *RowIdx = Visit(E->getRowIdx()); - Value *ColumnIdx = Visit(E->getColumnIdx()); + Value *RowIdx = CGF.EmitMatrixIndexExpr(E->getRowIdx()); + Value *ColumnIdx = CGF.EmitMatrixIndexExpr(E->getColumnIdx()); const auto *MatrixTy = E->getBase()->getType()->castAs(); unsigned NumRows = MatrixTy->getNumRows(); diff --git a/clang/lib/CodeGen/CodeGenFunction.h b/clang/lib/CodeGen/CodeGenFunction.h index e1b9ada3c1e1f..05f85f8b95bfa 100644 --- a/clang/lib/CodeGen/CodeGenFunction.h +++ b/clang/lib/CodeGen/CodeGenFunction.h @@ -4280,6 +4280,7 @@ class CodeGenFunction : public CodeGenTypeCache { LValue EmitUnaryOpLValue(const UnaryOperator *E); LValue EmitArraySubscriptExpr(const ArraySubscriptExpr *E, bool Accessed = false); + llvm::Value *EmitMatrixIndexExpr(const Expr *E); LValue EmitMatrixSubscriptExpr(const MatrixSubscriptExpr *E); LValue EmitArraySectionExpr(const ArraySectionExpr *E, bool IsLowerBound = true); diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp index c67183df335dd..ea57316ad8014 100644 --- a/clang/lib/Sema/SemaExpr.cpp +++ b/clang/lib/Sema/SemaExpr.cpp @@ -5033,8 +5033,7 @@ ExprResult Sema::CreateBuiltinMatrixSubscriptExpr(Expr *Base, Expr *RowIdx, } } - ExprResult ConvExpr = - tryConvertExprToType(IndexExpr, Context.getSizeType()); + ExprResult ConvExpr = IndexExpr; 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 4254780651c5f..e6fe4a6c57ff2 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 using m __attribute__((__matrix_type__(R,C))) = T; -// FIXME: should not warn here. double index1(m X, int i) { return X[i][0]; } -// expected-warning@-1 {{implicit conversion changes signedness: 'int' to 'unsigned long'}} double index2(m X, unsigned i) { return X[i][0]; } double index3(m X, char i) { return X[i][0]; } -// expected-warning@-1 {{implicit conversion changes signedness: 'char' to 'unsigned long'}} double index4(m X, int i) { return X[0][i]; } -// expected-warning@-1 {{implicit conversion changes signedness: 'int' to 'unsigned long'}} double index5(m X, unsigned i) { return X[0][i]; } double index6(m X, char i) { return X[0][i]; } -// expected-warning@-1 {{implicit conversion changes signedness: 'char' to 'unsigned long'}} + +// expected-no-diagnostics