diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -544,6 +544,8 @@ (`#48512 `_). - Fixed a failing assertion when parsing incomplete destructor. (`#63503 `_) +- Fixed a missed integer overflow warning with temporary values. + (`#63629 `_) Bug Fixes to Compiler Builtins ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/clang/lib/Sema/SemaChecking.cpp b/clang/lib/Sema/SemaChecking.cpp --- a/clang/lib/Sema/SemaChecking.cpp +++ b/clang/lib/Sema/SemaChecking.cpp @@ -15212,6 +15212,8 @@ Exprs.append(Message->arg_begin(), Message->arg_end()); else if (auto Construct = dyn_cast(E)) Exprs.append(Construct->arg_begin(), Construct->arg_end()); + else if (auto Temporary = dyn_cast(E)) + Exprs.push_back(Temporary->getSubExpr()); else if (auto Array = dyn_cast(E)) Exprs.push_back(Array->getIdx()); else if (auto Compound = dyn_cast(E)) diff --git a/clang/test/SemaCXX/integer-overflow.cpp b/clang/test/SemaCXX/integer-overflow.cpp --- a/clang/test/SemaCXX/integer-overflow.cpp +++ b/clang/test/SemaCXX/integer-overflow.cpp @@ -214,3 +214,32 @@ int a = -(1<<31); // expected-warning {{overflow in expression; result is -2147483648 with type 'int'}} } } + +#if __cplusplus >= 201103L +namespace GH63629 { +typedef long long int64_t; + +template +class u_ptr { + T *ptr; +public: + u_ptr(const u_ptr&) = delete; + u_ptr &operator=(const u_ptr&) = delete; + u_ptr(u_ptr &&other) : ptr(other.ptr) { other.ptr = 0; } + u_ptr(T *ptr) : ptr(ptr) { } + ~u_ptr() { delete ptr; } +}; + +u_ptr Wrap(int64_t x) { + return nullptr; +} + +int64_t Pass(int64_t x) { return x; } + +int m() { + int64_t x = Pass(30 * 24 * 60 * 59 * 1000); // expected-warning {{overflow in expression; result is -1746167296 with type 'int'}} + auto r = Wrap(Pass(30 * 24 * 60 * 59 * 1000)); // expected-warning {{overflow in expression; result is -1746167296 with type 'int'}} + return 0; +} +} +#endif