|
@@ -2458,24 +2458,17 @@ void CastOperation::CheckCStyleCast() {
|
|
|
// GCC's cast to union extension.
|
|
|
if (DestRecordTy && DestRecordTy->getDecl()->isUnion()) {
|
|
|
RecordDecl *RD = DestRecordTy->getDecl();
|
|
|
- RecordDecl::field_iterator Field, FieldEnd;
|
|
|
- for (Field = RD->field_begin(), FieldEnd = RD->field_end();
|
|
|
- Field != FieldEnd; ++Field) {
|
|
|
- if (Self.Context.hasSameUnqualifiedType(Field->getType(), SrcType) &&
|
|
|
- !Field->isUnnamedBitfield()) {
|
|
|
- Self.Diag(OpRange.getBegin(), diag::ext_typecheck_cast_to_union)
|
|
|
- << SrcExpr.get()->getSourceRange();
|
|
|
- break;
|
|
|
- }
|
|
|
- }
|
|
|
- if (Field == FieldEnd) {
|
|
|
+ if (CastExpr::getTargetFieldForToUnionCast(RD, SrcType)) {
|
|
|
+ Self.Diag(OpRange.getBegin(), diag::ext_typecheck_cast_to_union)
|
|
|
+ << SrcExpr.get()->getSourceRange();
|
|
|
+ Kind = CK_ToUnion;
|
|
|
+ return;
|
|
|
+ } else {
|
|
|
Self.Diag(OpRange.getBegin(), diag::err_typecheck_cast_to_union_no_type)
|
|
|
<< SrcType << SrcExpr.get()->getSourceRange();
|
|
|
SrcExpr = ExprError();
|
|
|
return;
|
|
|
}
|
|
|
- Kind = CK_ToUnion;
|
|
|
- return;
|
|
|
}
|
|
|
|
|
|
// OpenCL v2.0 s6.13.10 - Allow casts from '0' to event_t type.
|