PR44268: Fix crash if __builtin_object_size is applied to a heap
authorRichard Smith <richard@metafoo.co.uk>
Sat, 14 Dec 2019 02:38:33 +0000 (18:38 -0800)
committerRichard Smith <richard@metafoo.co.uk>
Sat, 14 Dec 2019 02:41:54 +0000 (18:41 -0800)
allocation.

clang/lib/AST/ExprConstant.cpp
clang/test/SemaCXX/builtin-object-size-cxx14.cpp

index fbc706b..f3856f5 100644 (file)
@@ -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>()) {
index a57bb6b..b7c6f6b 100644 (file)
@@ -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);
+}