Index: clang/lib/Sema/SemaChecking.cpp =================================================================== --- clang/lib/Sema/SemaChecking.cpp +++ clang/lib/Sema/SemaChecking.cpp @@ -14660,6 +14660,17 @@ Exprs.append(Call->arg_begin(), Call->arg_end()); else if (auto Message = dyn_cast(E)) 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 Array = dyn_cast(E)) + Exprs.push_back(Array->getIdx()); + else if (auto Compound = dyn_cast(E)) + Exprs.push_back(Compound->getInitializer()); + else if (auto New = dyn_cast(E)) { + if (New->isArray()) + if (auto ArraySize = New->getArraySize()) + Exprs.push_back(ArraySize.value()); + } } while (!Exprs.empty()); } Index: clang/test/Sema/integer-overflow.cpp =================================================================== --- /dev/null +++ clang/test/Sema/integer-overflow.cpp @@ -0,0 +1,18 @@ +// RUN: %clang_cc1 %s -Wno-unused-value -verify -fsyntax-only + +namespace GH58944 { +struct A { + A(unsigned long) ; +}; + +A a(1024 * 1024 * 1024 * 1024 * 1024ull); // expected-warning {{overflow in expression; result is 0 with type 'int'}} + +void f() { + new int[1024 * 1024 * 1024 * 1024 * 1024ull]; // expected-warning {{overflow in expression; result is 0 with type 'int'}} + + int arr[]{1,2,3}; + arr[1024 * 1024 * 1024 * 1024 * 1024ull]; // expected-warning {{overflow in expression; result is 0 with type 'int'}} + + (int){1024 * 1024 * 1024 * 1024 * 1024}; // expected-warning {{overflow in expression; result is 0 with type 'int'}} +} +}