Author: Richard Smith Date: 2020-12-18T01:08:42-08:00 New Revision: 569676c05725d79909bd8a9224bc709bd621553c
URL: https://github.com/llvm/llvm-project/commit/569676c05725d79909bd8a9224bc709bd621553c DIFF: https://github.com/llvm/llvm-project/commit/569676c05725d79909bd8a9224bc709bd621553c.diff LOG: Make Expr::HasSideEffect more precise for instantiation-dependent expressions. Fixes a regression in the clang-tidy test suite from making DeclRefExprs referring to dependent declarations be instantiation-dependent. Added: Modified: clang/lib/AST/Expr.cpp clang/lib/Sema/SemaExpr.cpp clang/lib/Sema/SemaExprCXX.cpp clang/lib/Sema/SemaType.cpp Removed: ################################################################################ diff --git a/clang/lib/AST/Expr.cpp b/clang/lib/AST/Expr.cpp index 0426b20a33a9..dafa7136ecb4 100644 --- a/clang/lib/AST/Expr.cpp +++ b/clang/lib/AST/Expr.cpp @@ -3242,9 +3242,6 @@ bool Expr::HasSideEffects(const ASTContext &Ctx, if (!IncludePossibleEffects && getExprLoc().isMacroID()) return false; - if (isInstantiationDependent()) - return IncludePossibleEffects; - switch (getStmtClass()) { case NoStmtClass: #define ABSTRACT_STMT(Type) @@ -3264,7 +3261,8 @@ bool Expr::HasSideEffects(const ASTContext &Ctx, case TypoExprClass: case RecoveryExprClass: case CXXFoldExprClass: - llvm_unreachable("shouldn't see dependent / unresolved nodes here"); + // Make a conservative assumption for dependent nodes. + return IncludePossibleEffects; case DeclRefExprClass: case ObjCIvarRefExprClass: diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp index ca1939222cf0..3992a373f721 100644 --- a/clang/lib/Sema/SemaExpr.cpp +++ b/clang/lib/Sema/SemaExpr.cpp @@ -4135,7 +4135,11 @@ bool Sema::CheckUnaryExprOrTypeTraitOperand(Expr *E, // The operand for sizeof and alignof is in an unevaluated expression context, // so side effects could result in unintended consequences. + // Exclude instantiation-dependent expressions, because 'sizeof' is sometimes + // used to build SFINAE gadgets. + // FIXME: Should we consider instantiation-dependent operands to 'alignof'? if (IsUnevaluatedOperand && !inTemplateInstantiation() && + !E->isInstantiationDependent() && E->HasSideEffects(Context, false)) Diag(E->getExprLoc(), diag::warn_side_effects_unevaluated_context); diff --git a/clang/lib/Sema/SemaExprCXX.cpp b/clang/lib/Sema/SemaExprCXX.cpp index 241b8f72c56e..05b28c11e5a5 100644 --- a/clang/lib/Sema/SemaExprCXX.cpp +++ b/clang/lib/Sema/SemaExprCXX.cpp @@ -7691,7 +7691,8 @@ ExprResult Sema::BuildCXXNoexceptExpr(SourceLocation KeyLoc, Expr *Operand, Operand = R.get(); - if (!inTemplateInstantiation() && Operand->HasSideEffects(Context, false)) { + if (!inTemplateInstantiation() && !Operand->isInstantiationDependent() && + Operand->HasSideEffects(Context, false)) { // The expression operand for noexcept is in an unevaluated expression // context, so side effects could result in unintended consequences. Diag(Operand->getExprLoc(), diag::warn_side_effects_unevaluated_context); diff --git a/clang/lib/Sema/SemaType.cpp b/clang/lib/Sema/SemaType.cpp index 6485bebc0e8e..00ec0c4a0cee 100644 --- a/clang/lib/Sema/SemaType.cpp +++ b/clang/lib/Sema/SemaType.cpp @@ -8993,9 +8993,11 @@ QualType Sema::BuildDecltypeType(Expr *E, SourceLocation Loc, assert(!E->hasPlaceholderType() && "unexpected placeholder"); if (AsUnevaluated && CodeSynthesisContexts.empty() && - E->HasSideEffects(Context, false)) { + !E->isInstantiationDependent() && E->HasSideEffects(Context, false)) { // The expression operand for decltype is in an unevaluated expression // context, so side effects could result in unintended consequences. + // Exclude instantiation-dependent expressions, because 'decltype' is often + // used to build SFINAE gadgets. Diag(E->getExprLoc(), diag::warn_side_effects_unevaluated_context); } _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits