From: Richard Smith Date: Fri, 11 Nov 2011 08:28:03 +0000 (+0000) Subject: Constant expression evalation: const_cast support. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=f64699e8db3946e21b5f4a0421cbc58a3e439599;p=clang Constant expression evalation: const_cast support. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@144382 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/AST/ExprConstant.cpp b/lib/AST/ExprConstant.cpp index 2027b42d96..7eb818d223 100644 --- a/lib/AST/ExprConstant.cpp +++ b/lib/AST/ExprConstant.cpp @@ -830,11 +830,8 @@ static bool ExtractSubobject(EvalInfo &Info, CCValue &Obj, QualType ObjType, const SubobjectDesignator &Sub, QualType SubType) { if (Sub.Invalid || Sub.OnePastTheEnd) return false; - if (Sub.Entries.empty()) { - assert(Info.Ctx.hasSameUnqualifiedType(ObjType, SubType) && - "Unexpected subobject type"); + if (Sub.Entries.empty()) return true; - } assert(!Obj.isLValue() && "extracting subobject of lvalue"); const APValue *O = &Obj; @@ -877,8 +874,6 @@ static bool ExtractSubobject(EvalInfo &Info, CCValue &Obj, QualType ObjType, return false; } - assert(Info.Ctx.hasSameUnqualifiedType(ObjType, SubType) && - "Unexpected subobject type"); Obj = CCValue(*O, CCValue::GlobalValue()); return true; } diff --git a/test/SemaCXX/constant-expression-cxx11.cpp b/test/SemaCXX/constant-expression-cxx11.cpp index c1d4a1109a..71a98a5fcf 100644 --- a/test/SemaCXX/constant-expression-cxx11.cpp +++ b/test/SemaCXX/constant-expression-cxx11.cpp @@ -77,6 +77,19 @@ namespace DerivedToVBaseCast { } +namespace ConstCast { + +constexpr int n1 = 0; +constexpr int n2 = const_cast(n1); +constexpr int *n3 = const_cast(&n1); +constexpr int n4 = *const_cast(&n1); +constexpr const int * const *n5 = const_cast(&n3); +constexpr int **n6 = const_cast(&n3); +constexpr int n7 = **n5; +constexpr int n8 = **n6; + +} + namespace TemplateArgumentConversion { template struct IntParam {};