diff options
| author | Richard Smith <richard-llvm@metafoo.co.uk> | 2013-12-12 03:40:18 +0000 |
|---|---|---|
| committer | Richard Smith <richard-llvm@metafoo.co.uk> | 2013-12-12 03:40:18 +0000 |
| commit | db05cd37a1e75fbdb9775f1b152e6546b94634e8 (patch) | |
| tree | fa76bc7a46322b03a5d5cd04ad6005eeb1d38e5b /clang/lib | |
| parent | 4b739894f0351c6b9c2b453ab6284e93920e39f8 (diff) | |
| download | bcm5719-llvm-db05cd37a1e75fbdb9775f1b152e6546b94634e8.tar.gz bcm5719-llvm-db05cd37a1e75fbdb9775f1b152e6546b94634e8.zip | |
PR17602: check accessibility when performing an implicit derived-to-base
conversion on the LHS of a .* or ->*. Slightly improve diagnostics in case
of an ambiguous base class.
llvm-svn: 197125
Diffstat (limited to 'clang/lib')
| -rw-r--r-- | clang/lib/Sema/SemaExprCXX.cpp | 19 |
1 files changed, 10 insertions, 9 deletions
diff --git a/clang/lib/Sema/SemaExprCXX.cpp b/clang/lib/Sema/SemaExprCXX.cpp index 3c9724d0be1..04871d367e8 100644 --- a/clang/lib/Sema/SemaExprCXX.cpp +++ b/clang/lib/Sema/SemaExprCXX.cpp @@ -4136,22 +4136,23 @@ QualType Sema::CheckPointerToMemberOperands(ExprResult &LHS, ExprResult &RHS, OpSpelling, (int)isIndirect)) { return QualType(); } - CXXBasePaths Paths(/*FindAmbiguities=*/true, /*RecordPaths=*/true, - /*DetectVirtual=*/false); - // FIXME: Would it be useful to print full ambiguity paths, or is that - // overkill? - if (!IsDerivedFrom(LHSType, Class, Paths) || - Paths.isAmbiguous(Context.getCanonicalType(Class))) { + + if (!IsDerivedFrom(LHSType, Class)) { Diag(Loc, diag::err_bad_memptr_lhs) << OpSpelling << (int)isIndirect << LHS.get()->getType(); return QualType(); } + + CXXCastPath BasePath; + if (CheckDerivedToBaseConversion(LHSType, Class, Loc, + SourceRange(LHS.get()->getLocStart(), + RHS.get()->getLocEnd()), + &BasePath)) + return QualType(); + // Cast LHS to type of use. QualType UseType = isIndirect ? Context.getPointerType(Class) : Class; ExprValueKind VK = isIndirect ? VK_RValue : LHS.get()->getValueKind(); - - CXXCastPath BasePath; - BuildBasePathArray(Paths, BasePath); LHS = ImpCastExprToType(LHS.take(), UseType, CK_DerivedToBase, VK, &BasePath); } |

