diff options
-rw-r--r-- | lib/AST/ExprConstant.cpp | 7 | ||||
-rw-r--r-- | test/SemaCXX/constant-expression-cxx11.cpp | 13 |
2 files changed, 14 insertions, 6 deletions
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<int&>(n1); +constexpr int *n3 = const_cast<int*>(&n1); +constexpr int n4 = *const_cast<int*>(&n1); +constexpr const int * const *n5 = const_cast<const int* const*>(&n3); +constexpr int **n6 = const_cast<int**>(&n3); +constexpr int n7 = **n5; +constexpr int n8 = **n6; + +} + namespace TemplateArgumentConversion { template<int n> struct IntParam {}; |