summaryrefslogtreecommitdiffstats
path: root/clang/lib
diff options
context:
space:
mode:
authorFariborz Jahanian <fjahanian@apple.com>2009-12-21 18:19:17 +0000
committerFariborz Jahanian <fjahanian@apple.com>2009-12-21 18:19:17 +0000
commitffc420cb51f187fa968d3bf7977e03acf47d79b8 (patch)
tree67fc440d79bf70e2b3e1b2e8247f5ccd802c7ee4 /clang/lib
parent0fc1f6c5950068ab817a3fe65c8e9b905fadd1e4 (diff)
downloadbcm5719-llvm-ffc420cb51f187fa968d3bf7977e03acf47d79b8.tar.gz
bcm5719-llvm-ffc420cb51f187fa968d3bf7977e03acf47d79b8.zip
Allow comparison of 'void *' with function pointer
as a g++ extension (fixes radar 7481987). llvm-svn: 91827
Diffstat (limited to 'clang/lib')
-rw-r--r--clang/lib/Sema/SemaExpr.cpp13
1 files changed, 12 insertions, 1 deletions
diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp
index 791948fb2b2..f67a7a6bb9d 100644
--- a/clang/lib/Sema/SemaExpr.cpp
+++ b/clang/lib/Sema/SemaExpr.cpp
@@ -5170,7 +5170,18 @@ QualType Sema::CheckCompareOperands(Expr *&lex, Expr *&rex, SourceLocation Loc,
if (getLangOptions().CPlusPlus) {
if (LCanPointeeTy == RCanPointeeTy)
return ResultTy;
-
+ if (!isRelational &&
+ (LCanPointeeTy->isVoidType() || RCanPointeeTy->isVoidType())) {
+ // Valid unless comparison between non-null pointer and function pointer
+ // This is a gcc extension compatibility comparison.
+ if ((LCanPointeeTy->isFunctionType() || RCanPointeeTy->isFunctionType())
+ && !LHSIsNull && !RHSIsNull) {
+ Diag(Loc, diag::ext_typecheck_comparison_of_fptr_to_void)
+ << lType << rType << lex->getSourceRange() << rex->getSourceRange();
+ ImpCastExprToType(rex, lType, CastExpr::CK_BitCast);
+ return ResultTy;
+ }
+ }
// C++ [expr.rel]p2:
// [...] Pointer conversions (4.10) and qualification
// conversions (4.4) are performed on pointer operands (or on
OpenPOWER on IntegriCloud