diff options
| author | Fariborz Jahanian <fjahanian@apple.com> | 2009-07-29 20:41:46 +0000 |
|---|---|---|
| committer | Fariborz Jahanian <fjahanian@apple.com> | 2009-07-29 20:41:46 +0000 |
| commit | 4b12ed115a594aff5b592feb5cf6613f06f3af70 (patch) | |
| tree | 4ba201c99aaa8faf54b7ae9da8e258df6870d0f0 /clang | |
| parent | ee68a483ec583cded1ac89033f246bdbb5f905ac (diff) | |
| download | bcm5719-llvm-4b12ed115a594aff5b592feb5cf6613f06f3af70.tar.gz bcm5719-llvm-4b12ed115a594aff5b592feb5cf6613f06f3af70.zip | |
Some refactoring of member access for
performace sake. Also added a test case.
llvm-svn: 77502
Diffstat (limited to 'clang')
| -rw-r--r-- | clang/lib/Sema/SemaExpr.cpp | 30 | ||||
| -rw-r--r-- | clang/test/SemaCXX/access-control-check.cpp | 16 |
2 files changed, 30 insertions, 16 deletions
diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp index 7e82df44377..fdaf9d82da8 100644 --- a/clang/lib/Sema/SemaExpr.cpp +++ b/clang/lib/Sema/SemaExpr.cpp @@ -1031,23 +1031,21 @@ Sema::PerformObjectMemberConversion(Expr *&From, NamedDecl *Member) { dyn_cast<CXXRecordDecl>(FD->getDeclContext())) { QualType DestType = Context.getCanonicalType(Context.getTypeDeclType(RD)); - if (!DestType->isDependentType() && - !From->getType()->isDependentType()) { - QualType FromRecordType = From->getType(); - QualType DestRecordType = DestType; - if (FromRecordType->getAsPointerType()) { - DestType = Context.getPointerType(DestType); - FromRecordType = FromRecordType->getPointeeType(); - } - if (IsDerivedFrom(FromRecordType, DestRecordType) && - CheckDerivedToBaseConversion(FromRecordType, - DestRecordType, - From->getSourceRange().getBegin(), - From->getSourceRange())) - return true; - - ImpCastExprToType(From, DestType, /*isLvalue=*/true); + if (DestType->isDependentType() || From->getType()->isDependentType()) + return false; + QualType FromRecordType = From->getType(); + QualType DestRecordType = DestType; + if (FromRecordType->getAsPointerType()) { + DestType = Context.getPointerType(DestType); + FromRecordType = FromRecordType->getPointeeType(); } + if (!Context.hasSameUnqualifiedType(FromRecordType, DestRecordType) && + CheckDerivedToBaseConversion(FromRecordType, + DestRecordType, + From->getSourceRange().getBegin(), + From->getSourceRange())) + return true; + ImpCastExprToType(From, DestType, /*isLvalue=*/true); } return false; } diff --git a/clang/test/SemaCXX/access-control-check.cpp b/clang/test/SemaCXX/access-control-check.cpp new file mode 100644 index 00000000000..d2acfe41673 --- /dev/null +++ b/clang/test/SemaCXX/access-control-check.cpp @@ -0,0 +1,16 @@ +// RUN: clang-cc -fsyntax-only -faccess-control -verify %s + +class M { + int iM; +}; + +class P { + int iP; + int PPR(); +}; + +class N : M,P { + N() {} + // FIXME. No access violation is reported in method call or member access. + int PR() { return iP + PPR(); } +}; |

