llvmbot wrote:

<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-clang

Author: Timm Baeder (tbaederr)

<details>
<summary>Changes</summary>



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


6 Files Affected:

- (modified) clang/lib/AST/ByteCode/Context.cpp (+3) 
- (modified) clang/lib/AST/ByteCode/Interp.h (+5) 
- (modified) clang/test/Sema/attr-overflow-behavior-constexpr.cpp (+1) 
- (modified) clang/test/Sema/attr-overflow-behavior-templates.cpp (+1) 
- (modified) clang/test/Sema/attr-overflow-behavior.c (+1) 
- (modified) clang/test/Sema/attr-overflow-behavior.cpp (+1) 


``````````diff
diff --git a/clang/lib/AST/ByteCode/Context.cpp 
b/clang/lib/AST/ByteCode/Context.cpp
index 879d51e6a2c3e..c811fac384fd4 100644
--- a/clang/lib/AST/ByteCode/Context.cpp
+++ b/clang/lib/AST/ByteCode/Context.cpp
@@ -470,6 +470,9 @@ OptPrimType Context::classify(QualType T) const {
   if (const auto *DT = dyn_cast<DecltypeType>(T))
     return classify(DT->getUnderlyingType());
 
+  if (const auto *OBT = T.getCanonicalType()->getAs<OverflowBehaviorType>())
+    return classify(OBT->getUnderlyingType());
+
   if (T->isObjCObjectPointerType() || T->isBlockPointerType())
     return PT_Ptr;
 
diff --git a/clang/lib/AST/ByteCode/Interp.h b/clang/lib/AST/ByteCode/Interp.h
index 7f30def20cc36..cb9a108a003bf 100644
--- a/clang/lib/AST/ByteCode/Interp.h
+++ b/clang/lib/AST/ByteCode/Interp.h
@@ -292,6 +292,11 @@ bool AddSubMulHelper(InterpState &S, CodePtr OpPC, 
unsigned Bits, const T &LHS,
   // If for some reason evaluation continues, use the truncated results.
   S.Stk.push<T>(Result);
 
+  // If wrapping is enabled, the new value is fine.
+  // FIXME: Pass this to the add/sub/mul op instead?
+  if (S.Current->getExpr(OpPC)->getType().isWrapType())
+    return true;
+
   // Short-circuit fixed-points here since the error handling is easier.
   if constexpr (std::is_same_v<T, FixedPoint>)
     return handleFixedPointOverflow(S, OpPC, Result);
diff --git a/clang/test/Sema/attr-overflow-behavior-constexpr.cpp 
b/clang/test/Sema/attr-overflow-behavior-constexpr.cpp
index ea5bc7fdb9fbe..9d3c73aa70c9d 100644
--- a/clang/test/Sema/attr-overflow-behavior-constexpr.cpp
+++ b/clang/test/Sema/attr-overflow-behavior-constexpr.cpp
@@ -1,4 +1,5 @@
 // RUN: %clang_cc1 -triple x86_64-linux-gnu %s 
-fexperimental-overflow-behavior-types -verify -fsyntax-only -std=c++14
+// RUN: %clang_cc1 -triple x86_64-linux-gnu %s 
-fexperimental-overflow-behavior-types -verify -fsyntax-only -std=c++14 
-fexperimental-new-constant-interpreter
 
 #define __wrap __attribute__((overflow_behavior(wrap)))
 #define __no_trap __attribute__((overflow_behavior(trap)))
diff --git a/clang/test/Sema/attr-overflow-behavior-templates.cpp 
b/clang/test/Sema/attr-overflow-behavior-templates.cpp
index 09242f6f9ab3a..40c7310b78e53 100644
--- a/clang/test/Sema/attr-overflow-behavior-templates.cpp
+++ b/clang/test/Sema/attr-overflow-behavior-templates.cpp
@@ -1,4 +1,5 @@
 // RUN: %clang_cc1 %s -fexperimental-overflow-behavior-types -verify 
-fsyntax-only -Wimplicit-overflow-behavior-conversion
+// RUN: %clang_cc1 %s -fexperimental-overflow-behavior-types -verify 
-fsyntax-only -Wimplicit-overflow-behavior-conversion 
-fexperimental-new-constant-interpreter
 
 template<typename T>
 constexpr int template_overload_test(T) {
diff --git a/clang/test/Sema/attr-overflow-behavior.c 
b/clang/test/Sema/attr-overflow-behavior.c
index 6ce876f09d802..7f2312537516d 100644
--- a/clang/test/Sema/attr-overflow-behavior.c
+++ b/clang/test/Sema/attr-overflow-behavior.c
@@ -1,4 +1,5 @@
 // RUN: %clang_cc1 %s -Winteger-overflow -Wno-unused-value 
-fexperimental-overflow-behavior-types -Woverflow-behavior-conversion 
-Wconstant-conversion -verify -fsyntax-only -std=c11 -Wno-pointer-sign
+// RUN: %clang_cc1 %s -Winteger-overflow -Wno-unused-value 
-fexperimental-overflow-behavior-types -Woverflow-behavior-conversion 
-Wconstant-conversion -verify -fsyntax-only -std=c11 -Wno-pointer-sign 
-fexperimental-new-constant-interpreter
 
 typedef int __attribute__((overflow_behavior)) bad_arg_count; // 
expected-error {{'overflow_behavior' attribute takes one argument}}
 typedef int __attribute__((overflow_behavior(not_real))) bad_arg_spec; // 
expected-error {{'not_real' is not a valid argument to attribute 
'overflow_behavior'}}
diff --git a/clang/test/Sema/attr-overflow-behavior.cpp 
b/clang/test/Sema/attr-overflow-behavior.cpp
index 1dfe00ab47ae2..a69eb83e591f5 100644
--- a/clang/test/Sema/attr-overflow-behavior.cpp
+++ b/clang/test/Sema/attr-overflow-behavior.cpp
@@ -1,4 +1,5 @@
 // RUN: %clang_cc1 %s -Winteger-overflow -Wno-unused-value 
-fexperimental-overflow-behavior-types -Wconstant-conversion 
-Woverflow-behavior-conversion -verify -fsyntax-only
+// RUN: %clang_cc1 %s -Winteger-overflow -Wno-unused-value 
-fexperimental-overflow-behavior-types -Wconstant-conversion 
-Woverflow-behavior-conversion -verify -fsyntax-only 
-fexperimental-new-constant-interpreter
 
 typedef int __attribute__((overflow_behavior)) bad_arg_count; // 
expected-error {{'overflow_behavior' attribute takes one argument}}
 typedef int __attribute__((overflow_behavior(not_real))) bad_arg_spec; // 
expected-error {{'not_real' is not a valid argument to attribute 
'overflow_behavior'}}

``````````

</details>


https://github.com/llvm/llvm-project/pull/183761
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to