diff options
author | Argyrios Kyrtzidis <akyrtzi@gmail.com> | 2011-04-22 23:57:57 +0000 |
---|---|---|
committer | Argyrios Kyrtzidis <akyrtzi@gmail.com> | 2011-04-22 23:57:57 +0000 |
commit | bb29d1ba8b0895e3923c724f49845636f35b4bde (patch) | |
tree | 1b850576b020e7f55ef2595cb5c3e234dce560a8 /lib/Sema/SemaCXXCast.cpp | |
parent | 13c8ccb59b38e9e7133f1c80a00f210b6514a0b1 (diff) |
Don't allow reinterpret_cast to reference of vector element and property expression. Thanks goes to Eli Friedman!
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@130036 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Sema/SemaCXXCast.cpp')
-rw-r--r-- | lib/Sema/SemaCXXCast.cpp | 15 |
1 files changed, 12 insertions, 3 deletions
diff --git a/lib/Sema/SemaCXXCast.cpp b/lib/Sema/SemaCXXCast.cpp index 29475539d7..743fdd2566 100644 --- a/lib/Sema/SemaCXXCast.cpp +++ b/lib/Sema/SemaCXXCast.cpp @@ -1327,9 +1327,18 @@ static TryCastResult TryReinterpretCast(Sema &Self, ExprResult &SrcExpr, // same effect as the conversion *reinterpret_cast<T*>(&x) with the // built-in & and * operators. - // Cannot get address of a bitfield. - if (SrcExpr.get()->getObjectKind() == OK_BitField) { - msg = diag::err_bad_reinterpret_cast_bitfield; + const char *inappropriate = 0; + switch (SrcExpr.get()->getObjectKind()) { + default: break; + case OK_BitField: inappropriate = "bit-field"; break; + case OK_VectorComponent: inappropriate = "vector element"; break; + case OK_ObjCProperty: inappropriate = "property expression"; break; + } + if (inappropriate) { + Self.Diag(OpRange.getBegin(), diag::err_bad_reinterpret_cast_reference) + << inappropriate << DestType + << OpRange << SrcExpr.get()->getSourceRange(); + msg = 0; SrcExpr = ExprError(); return TC_NotApplicable; } |