llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT--> @llvm/pr-subscribers-clang Author: Timm Baeder (tbaederr) <details> <summary>Changes</summary> ... if the result is narrower than 32 bits. See the discussion in https://github.com/llvm/llvm-project/issues/136135 --- Full diff: https://github.com/llvm/llvm-project/pull/171437.diff 2 Files Affected: - (modified) clang/lib/AST/ExprConstant.cpp (+6-3) - (modified) clang/test/CodeGenCXX/const-init.cpp (+4) ``````````diff diff --git a/clang/lib/AST/ExprConstant.cpp b/clang/lib/AST/ExprConstant.cpp index d81496ffd74e0..bcc896afac64e 100644 --- a/clang/lib/AST/ExprConstant.cpp +++ b/clang/lib/AST/ExprConstant.cpp @@ -18606,12 +18606,15 @@ bool IntExprEvaluator::VisitCastExpr(const CastExpr *E) { if (!Result.isInt()) { // Allow casts of address-of-label differences if they are no-ops - // or narrowing. (The narrowing case isn't actually guaranteed to + // or narrowing, if the result is at least 32 bits wide. + // (The narrowing case isn't actually guaranteed to // be constant-evaluatable except in some narrow cases which are hard // to detect here. We let it through on the assumption the user knows // what they are doing.) - if (Result.isAddrLabelDiff()) - return Info.Ctx.getTypeSize(DestType) <= Info.Ctx.getTypeSize(SrcType); + if (Result.isAddrLabelDiff()) { + unsigned DestBits = Info.Ctx.getTypeSize(DestType); + return DestBits >= 32 && DestBits <= Info.Ctx.getTypeSize(SrcType); + } // Only allow casts of lvalues if they are lossless. return Info.Ctx.getTypeSize(DestType) == Info.Ctx.getTypeSize(SrcType); } diff --git a/clang/test/CodeGenCXX/const-init.cpp b/clang/test/CodeGenCXX/const-init.cpp index fd6fd24ae1d94..f5b715949f23a 100644 --- a/clang/test/CodeGenCXX/const-init.cpp +++ b/clang/test/CodeGenCXX/const-init.cpp @@ -73,6 +73,10 @@ __int128_t PR11705 = (__int128_t)&PR11705; // CHECK: @_ZZ23UnfoldableAddrLabelDiffvE1x = internal global i128 0 void UnfoldableAddrLabelDiff() { static __int128_t x = (long)&&a-(long)&&b; a:b:return;} +// CHECK: @_ZZ24UnfoldableAddrLabelDiff2vE1x = internal global i16 0 +void UnfoldableAddrLabelDiff2() { static short x = (long)&&a-(long)&&b; a:b:return;} + + // But make sure we do fold this. // CHECK: @_ZZ21FoldableAddrLabelDiffvE1x = internal global i64 sub (i64 ptrtoint (ptr blockaddress(@_Z21FoldableAddrLabelDiffv void FoldableAddrLabelDiff() { static long x = (long)&&a-(long)&&b; a:b:return;} `````````` </details> https://github.com/llvm/llvm-project/pull/171437 _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
