[clang] 17d8a84 - [clang][Interp] Fix handling PointerToIntegral casts
Timm Bäder via cfe-commits
cfe-commits at lists.llvm.org
Fri Feb 16 05:32:14 PST 2024
Author: Timm Bäder
Date: 2024-02-16T14:31:42+01:00
New Revision: 17d8a84c32b7a3ecc3080c33fe2c780f029691a3
URL: https://github.com/llvm/llvm-project/commit/17d8a84c32b7a3ecc3080c33fe2c780f029691a3
DIFF: https://github.com/llvm/llvm-project/commit/17d8a84c32b7a3ecc3080c33fe2c780f029691a3.diff
LOG: [clang][Interp] Fix handling PointerToIntegral casts
We need to always emit the diagnostic, but still do the cast.
This is also what the current interpreter does.
Added:
Modified:
clang/lib/AST/Interp/Interp.cpp
clang/lib/AST/Interp/Interp.h
Removed:
################################################################################
diff --git a/clang/lib/AST/Interp/Interp.cpp b/clang/lib/AST/Interp/Interp.cpp
index 2a51f18adf02c5..51434d65e2f53b 100644
--- a/clang/lib/AST/Interp/Interp.cpp
+++ b/clang/lib/AST/Interp/Interp.cpp
@@ -533,17 +533,6 @@ bool CheckPure(InterpState &S, CodePtr OpPC, const CXXMethodDecl *MD) {
return false;
}
-bool CheckPotentialReinterpretCast(InterpState &S, CodePtr OpPC,
- const Pointer &Ptr) {
- if (!S.inConstantContext())
- return true;
-
- const SourceInfo &E = S.Current->getSource(OpPC);
- S.CCEDiag(E, diag::note_constexpr_invalid_cast)
- << 2 << S.getLangOpts().CPlusPlus << S.Current->getRange(OpPC);
- return false;
-}
-
bool CheckFloatResult(InterpState &S, CodePtr OpPC, const Floating &Result,
APFloat::opStatus Status) {
const SourceInfo &E = S.Current->getSource(OpPC);
diff --git a/clang/lib/AST/Interp/Interp.h b/clang/lib/AST/Interp/Interp.h
index 5bbb9f169a800e..344f523ed855a2 100644
--- a/clang/lib/AST/Interp/Interp.h
+++ b/clang/lib/AST/Interp/Interp.h
@@ -113,10 +113,6 @@ bool CheckThis(InterpState &S, CodePtr OpPC, const Pointer &This);
/// Checks if a method is pure virtual.
bool CheckPure(InterpState &S, CodePtr OpPC, const CXXMethodDecl *MD);
-/// Checks if reinterpret casts are legal in the current context.
-bool CheckPotentialReinterpretCast(InterpState &S, CodePtr OpPC,
- const Pointer &Ptr);
-
/// Sets the given integral value to the pointer, which is of
/// a std::{weak,partial,strong}_ordering type.
bool SetThreeWayComparisonField(InterpState &S, CodePtr OpPC,
@@ -1722,8 +1718,9 @@ template <PrimType Name, class T = typename PrimConv<Name>::T>
bool CastPointerIntegral(InterpState &S, CodePtr OpPC) {
const Pointer &Ptr = S.Stk.pop<Pointer>();
- if (!CheckPotentialReinterpretCast(S, OpPC, Ptr))
- return false;
+ const SourceInfo &E = S.Current->getSource(OpPC);
+ S.CCEDiag(E, diag::note_constexpr_invalid_cast)
+ << 2 << S.getLangOpts().CPlusPlus << S.Current->getRange(OpPC);
S.Stk.push<T>(T::from(Ptr.getIntegerRepresentation()));
return true;
More information about the cfe-commits
mailing list