| commit c5b890e922432bd80a5e3c6d82994ef4cdc41900 |
| Author: Richard Smith <richard@metafoo.co.uk> |
| Date: Fri Dec 13 18:38:33 2019 -0800 |
| |
| PR44268: Fix crash if __builtin_object_size is applied to a heap |
| allocation. |
| |
| diff --git a/clang/lib/AST/ExprConstant.cpp b/clang/lib/AST/ExprConstant.cpp |
| index fbc706b25d1..f3856f58b11 100644 |
| --- a/clang/lib/AST/ExprConstant.cpp |
| +++ b/clang/lib/AST/ExprConstant.cpp |
| @@ -10218,7 +10218,7 @@ static QualType getObjectType(APValue::LValueBase B) { |
| if (const ValueDecl *D = B.dyn_cast<const ValueDecl*>()) { |
| if (const VarDecl *VD = dyn_cast<VarDecl>(D)) |
| return VD->getType(); |
| - } else if (const Expr *E = B.get<const Expr*>()) { |
| + } else if (const Expr *E = B.dyn_cast<const Expr*>()) { |
| if (isa<CompoundLiteralExpr>(E)) |
| return E->getType(); |
| } else if (B.is<TypeInfoLValue>()) { |
| diff --git a/clang/test/SemaCXX/builtin-object-size-cxx14.cpp b/clang/test/SemaCXX/builtin-object-size-cxx14.cpp |
| index a57bb6b5378..b7c6f6be01f 100644 |
| --- a/clang/test/SemaCXX/builtin-object-size-cxx14.cpp |
| +++ b/clang/test/SemaCXX/builtin-object-size-cxx14.cpp |
| @@ -1,4 +1,4 @@ |
| -// RUN: %clang_cc1 -fsyntax-only -verify -std=c++14 %s |
| +// RUN: %clang_cc1 -fsyntax-only -verify=expected,cxx14 -std=c++14 %s |
| // RUN: %clang_cc1 -fsyntax-only -verify -std=c++2a %s |
| |
| typedef __SIZE_TYPE__ size_t; |
| @@ -113,3 +113,9 @@ namespace InvalidBase { |
| constexpr size_t bos_dtor = __builtin_object_size(&(T&)(T&&)invalid_base_2(), 0); |
| static_assert(bos_dtor == -1, ""); |
| } |
| + |
| +// PR44268 |
| +constexpr int bos_new() { // cxx14-error {{constant expression}} |
| + void *p = new int; // cxx14-note {{until C++20}} |
| + return __builtin_object_size(p, 0); |
| +} |