diff options
author | Fariborz Jahanian <fjahanian@apple.com> | 2009-12-21 18:19:17 +0000 |
---|---|---|
committer | Fariborz Jahanian <fjahanian@apple.com> | 2009-12-21 18:19:17 +0000 |
commit | ffc420cb51f187fa968d3bf7977e03acf47d79b8 (patch) | |
tree | 67fc440d79bf70e2b3e1b2e8247f5ccd802c7ee4 /clang/lib | |
parent | 0fc1f6c5950068ab817a3fe65c8e9b905fadd1e4 (diff) | |
download | bcm5719-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.cpp | 13 |
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 |