diff options
author | David Majnemer <david.majnemer@gmail.com> | 2014-01-17 09:01:00 +0000 |
---|---|---|
committer | David Majnemer <david.majnemer@gmail.com> | 2014-01-17 09:01:00 +0000 |
commit | 1cdd96d6adb24104bb364460d87ec4723fc3b033 (patch) | |
tree | 7e543fc53f19fb098fd2954789125f484d213a8e /clang/lib/Sema/SemaExpr.cpp | |
parent | a64851bccbd753cd66535d44d92e15f383109589 (diff) | |
download | bcm5719-llvm-1cdd96d6adb24104bb364460d87ec4723fc3b033.tar.gz bcm5719-llvm-1cdd96d6adb24104bb364460d87ec4723fc3b033.zip |
Revert "Revert r199416, "MS ABI: Improve selection of an inheritance model""
This reverts commit r199475 (which reverted r199416) with fixes for the
breakages.
We wouldn't lock an inheritance model if we saw a pointer-to-member
formed as a result of the address-of operator.
llvm-svn: 199482
Diffstat (limited to 'clang/lib/Sema/SemaExpr.cpp')
-rw-r--r-- | clang/lib/Sema/SemaExpr.cpp | 16 |
1 files changed, 12 insertions, 4 deletions
diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp index 8531286a9c7..268087f5066 100644 --- a/clang/lib/Sema/SemaExpr.cpp +++ b/clang/lib/Sema/SemaExpr.cpp @@ -8855,8 +8855,11 @@ QualType Sema::CheckAddressOfOperand(ExprResult &OrigOp, SourceLocation OpLoc) { if (isa<CXXDestructorDecl>(MD)) Diag(OpLoc, diag::err_typecheck_addrof_dtor) << op->getSourceRange(); - return Context.getMemberPointerType(op->getType(), - Context.getTypeDeclType(MD->getParent()).getTypePtr()); + QualType MPTy = Context.getMemberPointerType( + op->getType(), Context.getTypeDeclType(MD->getParent()).getTypePtr()); + if (Context.getTargetInfo().getCXXABI().isMicrosoft()) + RequireCompleteType(OpLoc, MPTy, 0); + return MPTy; } else if (lval != Expr::LV_Valid && lval != Expr::LV_IncompleteVoidType) { // C99 6.5.3.2p1 // The operand must be either an l-value or a function designator @@ -8904,8 +8907,13 @@ QualType Sema::CheckAddressOfOperand(ExprResult &OrigOp, SourceLocation OpLoc) { while (cast<RecordDecl>(Ctx)->isAnonymousStructOrUnion()) Ctx = Ctx->getParent(); - return Context.getMemberPointerType(op->getType(), - Context.getTypeDeclType(cast<RecordDecl>(Ctx)).getTypePtr()); + + QualType MPTy = Context.getMemberPointerType( + op->getType(), + Context.getTypeDeclType(cast<RecordDecl>(Ctx)).getTypePtr()); + if (Context.getTargetInfo().getCXXABI().isMicrosoft()) + RequireCompleteType(OpLoc, MPTy, 0); + return MPTy; } } } else if (!isa<FunctionDecl>(dcl) && !isa<NonTypeTemplateParmDecl>(dcl)) |