diff options
| author | John McCall <rjmccall@apple.com> | 2011-09-09 05:25:32 +0000 |
|---|---|---|
| committer | John McCall <rjmccall@apple.com> | 2011-09-09 05:25:32 +0000 |
| commit | 9320b87cff21e87752c5b511ba49aaead5d5792c (patch) | |
| tree | 47977c15fd7ca50d320cb73f624a0d5010ecad86 /clang/lib/Sema/SemaDeclObjC.cpp | |
| parent | 10162ab7edce78aab8c9943b0c15eef4a4115db0 (diff) | |
| download | bcm5719-llvm-9320b87cff21e87752c5b511ba49aaead5d5792c.tar.gz bcm5719-llvm-9320b87cff21e87752c5b511ba49aaead5d5792c.zip | |
Give conversions of block pointers to ObjC pointers a different cast kind
than conversions of C pointers to ObjC pointers. In order to ensure that
we've caught every case, add asserts to CastExpr that strictly determine
which cast kind is used for which kind of bit cast.
llvm-svn: 139352
Diffstat (limited to 'clang/lib/Sema/SemaDeclObjC.cpp')
| -rw-r--r-- | clang/lib/Sema/SemaDeclObjC.cpp | 7 |
1 files changed, 6 insertions, 1 deletions
diff --git a/clang/lib/Sema/SemaDeclObjC.cpp b/clang/lib/Sema/SemaDeclObjC.cpp index 8dfdeb4b607..94de7992ba1 100644 --- a/clang/lib/Sema/SemaDeclObjC.cpp +++ b/clang/lib/Sema/SemaDeclObjC.cpp @@ -1767,11 +1767,16 @@ static bool matchTypes(ASTContext &Context, Sema::MethodMatchStrategy strategy, if (!left->isScalarType() || !right->isScalarType()) return tryMatchRecordTypes(Context, strategy, left, right); - // Make scalars agree in kind, except count bools as chars. + // Make scalars agree in kind, except count bools as chars, and group + // all non-member pointers together. Type::ScalarTypeKind leftSK = left->getScalarTypeKind(); Type::ScalarTypeKind rightSK = right->getScalarTypeKind(); if (leftSK == Type::STK_Bool) leftSK = Type::STK_Integral; if (rightSK == Type::STK_Bool) rightSK = Type::STK_Integral; + if (leftSK == Type::STK_CPointer || leftSK == Type::STK_BlockPointer) + leftSK = Type::STK_ObjCObjectPointer; + if (rightSK == Type::STK_CPointer || rightSK == Type::STK_BlockPointer) + rightSK = Type::STK_ObjCObjectPointer; // Note that data member pointers and function member pointers don't // intermix because of the size differences. |

