diff options
Diffstat (limited to 'clang/lib/Sema/SemaExpr.cpp')
-rw-r--r-- | clang/lib/Sema/SemaExpr.cpp | 86 |
1 files changed, 1 insertions, 85 deletions
diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp index cd953ab8986..59efbc1bb6a 100644 --- a/clang/lib/Sema/SemaExpr.cpp +++ b/clang/lib/Sema/SemaExpr.cpp @@ -9380,90 +9380,6 @@ static inline UnaryOperatorKind ConvertTokenKindToUnaryOpcode( return Opc; } -/// DiagnoseSelfMove - Emits a warning if a value is moved to itself. -static void DiagnoseSelfMove(Sema &S, const Expr *LHSExpr, const Expr *RHSExpr, - SourceLocation OpLoc) { - if (!S.ActiveTemplateInstantiations.empty()) - return; - - // Strip parens and casts away. - LHSExpr = LHSExpr->IgnoreParenImpCasts(); - RHSExpr = RHSExpr->IgnoreParenImpCasts(); - - // Check for a call expression - const CallExpr *CE = dyn_cast<CallExpr>(RHSExpr); - if (!CE || CE->getNumArgs() != 1) - return; - - // Check for a call to std::move - const FunctionDecl *FD = CE->getDirectCallee(); - if (!FD || !FD->isInStdNamespace() || !FD->getIdentifier() || - !FD->getIdentifier()->isStr("move")) - return; - - // Get argument from std::move - RHSExpr = CE->getArg(0); - - const DeclRefExpr *LHSDeclRef = dyn_cast<DeclRefExpr>(LHSExpr); - const DeclRefExpr *RHSDeclRef = dyn_cast<DeclRefExpr>(RHSExpr); - - // Two DeclRefExpr's, check that the decls are the same. - if (LHSDeclRef && RHSDeclRef) { - if (!LHSDeclRef->getDecl() || !RHSDeclRef->getDecl()) - return; - if (LHSDeclRef->getDecl()->getCanonicalDecl() != - RHSDeclRef->getDecl()->getCanonicalDecl()) - return; - - S.Diag(OpLoc, diag::warn_self_move) << LHSExpr->getType() - << LHSExpr->getSourceRange() - << RHSExpr->getSourceRange(); - return; - } - - // Member variables require a different approach to check for self moves. - // MemberExpr's are the same if every nested MemberExpr refers to the same - // Decl and that the base Expr's are DeclRefExpr's with the same Decl or - // the base Expr's are CXXThisExpr's. - const Expr *LHSBase = LHSExpr; - const Expr *RHSBase = RHSExpr; - const MemberExpr *LHSME = dyn_cast<MemberExpr>(LHSExpr); - const MemberExpr *RHSME = dyn_cast<MemberExpr>(RHSExpr); - if (!LHSME || !RHSME) - return; - - while (LHSME && RHSME) { - if (LHSME->getMemberDecl()->getCanonicalDecl() != - RHSME->getMemberDecl()->getCanonicalDecl()) - return; - - LHSBase = LHSME->getBase(); - RHSBase = RHSME->getBase(); - LHSME = dyn_cast<MemberExpr>(LHSBase); - RHSME = dyn_cast<MemberExpr>(RHSBase); - } - - LHSDeclRef = dyn_cast<DeclRefExpr>(LHSBase); - RHSDeclRef = dyn_cast<DeclRefExpr>(RHSBase); - if (LHSDeclRef && RHSDeclRef) { - if (!LHSDeclRef->getDecl() || !RHSDeclRef->getDecl()) - return; - if (LHSDeclRef->getDecl()->getCanonicalDecl() != - RHSDeclRef->getDecl()->getCanonicalDecl()) - return; - - S.Diag(OpLoc, diag::warn_self_move) << LHSExpr->getType() - << LHSExpr->getSourceRange() - << RHSExpr->getSourceRange(); - return; - } - - if (isa<CXXThisExpr>(LHSBase) && isa<CXXThisExpr>(RHSBase)) - S.Diag(OpLoc, diag::warn_self_move) << LHSExpr->getType() - << LHSExpr->getSourceRange() - << RHSExpr->getSourceRange(); -} - /// DiagnoseSelfAssignment - Emits a warning if a value is assigned to itself. /// This warning is only emitted for builtin assignment operations. It is also /// suppressed in the event of macro expansions. @@ -9593,7 +9509,7 @@ ExprResult Sema::CreateBuiltinBinOp(SourceLocation OpLoc, } if (!ResultTy.isNull()) { DiagnoseSelfAssignment(*this, LHS.get(), RHS.get(), OpLoc); - DiagnoseSelfMove(*this, LHS.get(), RHS.get(), OpLoc); + DiagnoseSelfMove(LHS.get(), RHS.get(), OpLoc); } RecordModifiableNonNullParam(*this, LHS.get()); break; |