summaryrefslogtreecommitdiffstats
path: root/clang/lib/Sema/SemaExpr.cpp
diff options
context:
space:
mode:
authorDouglas Gregor <dgregor@apple.com>2008-11-19 03:25:36 +0000
committerDouglas Gregor <dgregor@apple.com>2008-11-19 03:25:36 +0000
commitca63811b396757f97c84a7965eba6a4a8c26417e (patch)
treed9bd6845bb908704cd84aacb5512bc0ef65e8286 /clang/lib/Sema/SemaExpr.cpp
parent2dd5aa4f1177b4b4c99dc20d630033082ac471aa (diff)
downloadbcm5719-llvm-ca63811b396757f97c84a7965eba6a4a8c26417e.tar.gz
bcm5719-llvm-ca63811b396757f97c84a7965eba6a4a8c26417e.zip
Built-in equality and relational operators have return type "bool" in C++,
not "int". Fix a typo in the promotion of enumeration types that was causing some integral promotions to look like integral conversions (leading to extra ambiguities in overload resolution). Check for "acceptable" overloaded operators based on the types of the arguments. This is a somewhat odd check that is specified by the standard, but I can't see why it actually matters: the overload candidates it suppresses don't seem like they would ever be picked as the best candidates. llvm-svn: 59583
Diffstat (limited to 'clang/lib/Sema/SemaExpr.cpp')
-rw-r--r--clang/lib/Sema/SemaExpr.cpp29
1 files changed, 16 insertions, 13 deletions
diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp
index 960c99af1f2..0e62e26e8b5 100644
--- a/clang/lib/Sema/SemaExpr.cpp
+++ b/clang/lib/Sema/SemaExpr.cpp
@@ -2145,9 +2145,12 @@ QualType Sema::CheckCompareOperands(Expr *&lex, Expr *&rex, SourceLocation Loc,
Diag(Loc, diag::warn_selfcomparison);
}
+ // The result of comparisons is 'bool' in C++, 'int' in C.
+ QualType ResultTy = getLangOptions().CPlusPlus? Context.BoolTy : Context.IntTy;
+
if (isRelational) {
if (lType->isRealType() && rType->isRealType())
- return Context.IntTy;
+ return ResultTy;
} else {
// Check for comparisons of floating point operands using != and ==.
if (lType->isFloatingType()) {
@@ -2156,7 +2159,7 @@ QualType Sema::CheckCompareOperands(Expr *&lex, Expr *&rex, SourceLocation Loc,
}
if (lType->isArithmeticType() && rType->isArithmeticType())
- return Context.IntTy;
+ return ResultTy;
}
bool LHSIsNull = lex->isNullPointerConstant(Context);
@@ -2181,7 +2184,7 @@ QualType Sema::CheckCompareOperands(Expr *&lex, Expr *&rex, SourceLocation Loc,
<< lex->getSourceRange() << rex->getSourceRange();
}
ImpCastExprToType(rex, lType); // promote the pointer to pointer
- return Context.IntTy;
+ return ResultTy;
}
// Handle block pointer types.
if (lType->isBlockPointerType() && rType->isBlockPointerType()) {
@@ -2195,7 +2198,7 @@ QualType Sema::CheckCompareOperands(Expr *&lex, Expr *&rex, SourceLocation Loc,
<< lex->getSourceRange() << rex->getSourceRange();
}
ImpCastExprToType(rex, lType); // promote the pointer to pointer
- return Context.IntTy;
+ return ResultTy;
}
// Allow block pointers to be compared with null pointer constants.
if ((lType->isBlockPointerType() && rType->isPointerType()) ||
@@ -2206,7 +2209,7 @@ QualType Sema::CheckCompareOperands(Expr *&lex, Expr *&rex, SourceLocation Loc,
<< lex->getSourceRange() << rex->getSourceRange();
}
ImpCastExprToType(rex, lType); // promote the pointer to pointer
- return Context.IntTy;
+ return ResultTy;
}
if ((lType->isObjCQualifiedIdType() || rType->isObjCQualifiedIdType())) {
@@ -2224,21 +2227,21 @@ QualType Sema::CheckCompareOperands(Expr *&lex, Expr *&rex, SourceLocation Loc,
<< lType.getAsString() << rType.getAsString()
<< lex->getSourceRange() << rex->getSourceRange();
ImpCastExprToType(rex, lType);
- return Context.IntTy;
+ return ResultTy;
}
ImpCastExprToType(rex, lType);
- return Context.IntTy;
+ return ResultTy;
}
if (ObjCQualifiedIdTypesAreCompatible(lType, rType, true)) {
ImpCastExprToType(rex, lType);
- return Context.IntTy;
+ return ResultTy;
} else {
if ((lType->isObjCQualifiedIdType() && rType->isObjCQualifiedIdType())) {
Diag(Loc, diag::warn_incompatible_qualified_id_operands)
<< lType.getAsString() << rType.getAsString()
<< lex->getSourceRange() << rex->getSourceRange();
ImpCastExprToType(rex, lType);
- return Context.IntTy;
+ return ResultTy;
}
}
}
@@ -2249,7 +2252,7 @@ QualType Sema::CheckCompareOperands(Expr *&lex, Expr *&rex, SourceLocation Loc,
<< lType.getAsString() << rType.getAsString()
<< lex->getSourceRange() << rex->getSourceRange();
ImpCastExprToType(rex, lType); // promote the integer to pointer
- return Context.IntTy;
+ return ResultTy;
}
if (lType->isIntegerType() &&
(rType->isPointerType() || rType->isObjCQualifiedIdType())) {
@@ -2258,7 +2261,7 @@ QualType Sema::CheckCompareOperands(Expr *&lex, Expr *&rex, SourceLocation Loc,
<< lType.getAsString() << rType.getAsString()
<< lex->getSourceRange() << rex->getSourceRange();
ImpCastExprToType(lex, rType); // promote the integer to pointer
- return Context.IntTy;
+ return ResultTy;
}
// Handle block pointers.
if (lType->isBlockPointerType() && rType->isIntegerType()) {
@@ -2267,7 +2270,7 @@ QualType Sema::CheckCompareOperands(Expr *&lex, Expr *&rex, SourceLocation Loc,
<< lType.getAsString() << rType.getAsString()
<< lex->getSourceRange() << rex->getSourceRange();
ImpCastExprToType(rex, lType); // promote the integer to pointer
- return Context.IntTy;
+ return ResultTy;
}
if (lType->isIntegerType() && rType->isBlockPointerType()) {
if (!LHSIsNull)
@@ -2275,7 +2278,7 @@ QualType Sema::CheckCompareOperands(Expr *&lex, Expr *&rex, SourceLocation Loc,
<< lType.getAsString() << rType.getAsString()
<< lex->getSourceRange() << rex->getSourceRange();
ImpCastExprToType(lex, rType); // promote the integer to pointer
- return Context.IntTy;
+ return ResultTy;
}
return InvalidOperands(Loc, lex, rex);
}
OpenPOWER on IntegriCloud