[clang] [Clang] Introduce OverflowBehaviorType for fine-grained overflow control (PR #148914)
Matheus Izvekov via cfe-commits
cfe-commits at lists.llvm.org
Fri Aug 22 19:56:23 PDT 2025
================
@@ -11710,6 +11809,48 @@ QualType ASTContext::mergeTagDefinitions(QualType LHS, QualType RHS) {
return Ctx.IsEquivalent(LHS, RHS) ? LHS : QualType{};
}
+std::optional<QualType> ASTContext::tryMergeOverflowBehaviorTypes(
+ QualType LHS, QualType RHS, bool OfBlockPointer, bool Unqualified,
+ bool BlockReturnType, bool IsConditionalOperator) {
+ const auto *LHSOBT = LHS->getAs<OverflowBehaviorType>();
+ const auto *RHSOBT = RHS->getAs<OverflowBehaviorType>();
+
+ if (!LHSOBT && !RHSOBT)
+ return std::nullopt;
+
+ if (LHSOBT) {
+ if (RHSOBT) {
+ // Both are OverflowBehaviorTypes.
+ if (LHSOBT->getBehaviorKind() != RHSOBT->getBehaviorKind())
+ return QualType(); // Incompatible if behaviors differ.
+
+ QualType MergedUnderlying = mergeTypes(
+ LHSOBT->getUnderlyingType(), RHSOBT->getUnderlyingType(),
+ OfBlockPointer, Unqualified, BlockReturnType, IsConditionalOperator);
+
+ if (MergedUnderlying.isNull())
+ return QualType();
+
+ // If the merged underlying type is the same as one of the original
+ // underlying types, we can return the original OBT to preserve typedefs.
+ if (getCanonicalType(MergedUnderlying) ==
+ getCanonicalType(LHSOBT->getUnderlyingType()))
+ return LHS;
+ if (getCanonicalType(MergedUnderlying) ==
+ getCanonicalType(RHSOBT->getUnderlyingType()))
+ return RHS;
----------------
mizvekov wrote:
If the RHS and LHS underlying types are the same type, this should use `ASTContext::getCommonSugaredType`.
If the merged type is not the same, I don't think it makes sense to arbitrarily pick the typedefs of one side or the other.
For example, if one side is `pid_t`, the other side is `clockid_t`, I don't think picking either one as the result is sensible.
https://github.com/llvm/llvm-project/pull/148914
More information about the cfe-commits
mailing list