summaryrefslogtreecommitdiffstats
path: root/clang/Sema/SemaExpr.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'clang/Sema/SemaExpr.cpp')
-rw-r--r--clang/Sema/SemaExpr.cpp68
1 files changed, 2 insertions, 66 deletions
diff --git a/clang/Sema/SemaExpr.cpp b/clang/Sema/SemaExpr.cpp
index 6c3b06e0155..a9cd41580bb 100644
--- a/clang/Sema/SemaExpr.cpp
+++ b/clang/Sema/SemaExpr.cpp
@@ -12,6 +12,7 @@
//===----------------------------------------------------------------------===//
#include "Sema.h"
+#include "SemaUtil.h"
#include "clang/AST/ASTContext.h"
#include "clang/AST/Decl.h"
#include "clang/AST/DeclObjC.h"
@@ -1213,42 +1214,6 @@ inline QualType Sema::CheckShiftOperands( // C99 6.5.7
return QualType();
}
-// Utility method to plow through parentheses to get the first nested
-// non-ParenExpr expr.
-static inline Expr* IgnoreParen(Expr* E) {
- while (ParenExpr* P = dyn_cast<ParenExpr>(E))
- E = P->getSubExpr();
-
- return E;
-}
-
-// Utility method to plow through parenthesis and casts.
-static inline Expr* IgnoreParenCasts(Expr* E) {
- while(true) {
- if (ParenExpr* P = dyn_cast<ParenExpr>(E))
- E = P->getSubExpr();
- else if (CastExpr* P = dyn_cast<CastExpr>(E))
- E = P->getSubExpr();
- else if (ImplicitCastExpr* P = dyn_cast<ImplicitCastExpr>(E))
- E = P->getSubExpr();
- else
- break;
- }
-
- return E;
-}
-
-// Utility method to determine if a CallExpr is a call to a builtin.
-static inline bool isCallBuiltin(CallExpr* cexp) {
- Expr* sub = IgnoreParenCasts(cexp->getCallee());
-
- if (DeclRefExpr* E = dyn_cast<DeclRefExpr>(sub))
- if (E->getDecl()->getIdentifier()->getBuiltinID() > 0)
- return true;
-
- return false;
-}
-
inline QualType Sema::CheckCompareOperands( // C99 6.5.8
Expr *&lex, Expr *&rex, SourceLocation loc, bool isRelational)
{
@@ -1277,38 +1242,9 @@ inline QualType Sema::CheckCompareOperands( // C99 6.5.8
return Context.IntTy;
} else {
// Check for comparisons of floating point operands using != and ==.
- // Issue a warning if these are no self-comparisons, as they are not likely
- // to do what the programmer intended.
if (lType->isFloatingType()) {
assert (rType->isFloatingType());
-
- // Special case: check for x == x (which is OK).
- bool EmitWarning = true;
-
- Expr* LeftExprSansParen = IgnoreParen(lex);
- Expr* RightExprSansParen = IgnoreParen(rex);
-
- // Look for x == x. Do not emit warnings for such cases.
- if (DeclRefExpr* DRL = dyn_cast<DeclRefExpr>(LeftExprSansParen))
- if (DeclRefExpr* DRR = dyn_cast<DeclRefExpr>(RightExprSansParen))
- if (DRL->getDecl() == DRR->getDecl())
- EmitWarning = false;
-
- // Check for comparisons with builtin types.
- if (EmitWarning)
- if (CallExpr* CL = dyn_cast<CallExpr>(LeftExprSansParen))
- if (isCallBuiltin(CL))
- EmitWarning = false;
-
- if (EmitWarning)
- if (CallExpr* CR = dyn_cast<CallExpr>(RightExprSansParen))
- if (isCallBuiltin(CR))
- EmitWarning = false;
-
- // Emit the diagnostic.
- if (EmitWarning)
- Diag(loc, diag::warn_floatingpoint_eq,
- lex->getSourceRange(),rex->getSourceRange());
+ CheckFloatComparison(loc,lex,rex);
}
if (lType->isArithmeticType() && rType->isArithmeticType())
OpenPOWER on IntegriCloud