diff options
-rw-r--r-- | clang/lib/Sema/SemaCXXCast.cpp | 5 | ||||
-rw-r--r-- | clang/test/SemaTemplate/dependent-expr.cpp | 9 |
2 files changed, 13 insertions, 1 deletions
diff --git a/clang/lib/Sema/SemaCXXCast.cpp b/clang/lib/Sema/SemaCXXCast.cpp index 2a52f178765..214d1f61755 100644 --- a/clang/lib/Sema/SemaCXXCast.cpp +++ b/clang/lib/Sema/SemaCXXCast.cpp @@ -1375,13 +1375,16 @@ Sema::CXXCheckCStyleCast(SourceRange R, QualType CastTy, ExprValueKind &VK, return false; } + // Make sure we determine the value kind before we bail out for + // dependent types. + VK = Expr::getValueKindForType(CastTy); + // If the type is dependent, we won't do any other semantic analysis now. if (CastTy->isDependentType() || CastExpr->isTypeDependent()) { Kind = CK_Dependent; return false; } - VK = Expr::getValueKindForType(CastTy); if (VK == VK_RValue && !CastTy->isRecordType()) DefaultFunctionArrayLvalueConversion(CastExpr); diff --git a/clang/test/SemaTemplate/dependent-expr.cpp b/clang/test/SemaTemplate/dependent-expr.cpp index f3970d1d710..f26c85b1ecc 100644 --- a/clang/test/SemaTemplate/dependent-expr.cpp +++ b/clang/test/SemaTemplate/dependent-expr.cpp @@ -52,3 +52,12 @@ namespace test4 { &const_cast<char&>(reinterpret_cast<const volatile char &>(v))); } } + +namespace test5 { + template <typename T> class chained_map { + int k; + void lookup() const { + int &v = (int &)k; + } + }; +} |