From f041733585024574a4965dd80e3931442bd8472d Mon Sep 17 00:00:00 2001 From: Hal Finkel Date: Thu, 17 Jul 2014 14:25:55 +0000 Subject: Add an __assume side-effects warning In MS-compatibility mode, we support the __assume builtin. The __assume builtin does not evaluate its arguments, and we should issue a warning if __assume is provided with an argument with side effects (because these effects will be discarded). This is similar in spirit to the warnings issued by other compilers (Intel Diagnostic 2261, MS Compiler Warning C4557). llvm-svn: 213266 --- clang/lib/Sema/SemaChecking.cpp | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) (limited to 'clang/lib/Sema/SemaChecking.cpp') diff --git a/clang/lib/Sema/SemaChecking.cpp b/clang/lib/Sema/SemaChecking.cpp index 7a23797d477..d8b801bf0a6 100644 --- a/clang/lib/Sema/SemaChecking.cpp +++ b/clang/lib/Sema/SemaChecking.cpp @@ -175,6 +175,10 @@ Sema::CheckBuiltinFunctionCall(unsigned BuiltinID, CallExpr *TheCall) { if (SemaBuiltinPrefetch(TheCall)) return ExprError(); break; + case Builtin::BI__assume: + if (SemaBuiltinAssume(TheCall)) + return ExprError(); + break; case Builtin::BI__builtin_object_size: if (SemaBuiltinConstantArgRange(TheCall, 1, 0, 3)) return ExprError(); @@ -1953,6 +1957,20 @@ bool Sema::SemaBuiltinPrefetch(CallExpr *TheCall) { return false; } +/// SemaBuiltinAssume - Handle __assume (MS Extension). +// __assume does not evaluate its arguments, and should warn if its argument +// has side effects. +bool Sema::SemaBuiltinAssume(CallExpr *TheCall) { + Expr *Arg = TheCall->getArg(0); + if (Arg->isInstantiationDependent()) return false; + + if (Arg->HasSideEffects(Context)) + return Diag(Arg->getLocStart(), diag::warn_assume_side_effects) + << Arg->getSourceRange(); + + return false; +} + /// SemaBuiltinConstantArg - Handle a check if argument ArgNum of CallExpr /// TheCall is a constant expression. bool Sema::SemaBuiltinConstantArg(CallExpr *TheCall, int ArgNum, -- cgit v1.2.3