xref: /freebsd/contrib/llvm-project/clang/lib/Sema/SemaCast.cpp (revision 700637cbb5e582861067a11aaca4d053546871d2)
1 //===--- SemaCast.cpp - Semantic Analysis for Casts -----------------------===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 //
9 //  This file implements semantic analysis for cast expressions, including
10 //  1) C-style casts like '(int) x'
11 //  2) C++ functional casts like 'int(x)'
12 //  3) C++ named casts like 'static_cast<int>(x)'
13 //
14 //===----------------------------------------------------------------------===//
15 
16 #include "clang/AST/ASTContext.h"
17 #include "clang/AST/ASTStructuralEquivalence.h"
18 #include "clang/AST/CXXInheritance.h"
19 #include "clang/AST/ExprCXX.h"
20 #include "clang/AST/ExprObjC.h"
21 #include "clang/AST/RecordLayout.h"
22 #include "clang/Basic/PartialDiagnostic.h"
23 #include "clang/Basic/TargetInfo.h"
24 #include "clang/Lex/Preprocessor.h"
25 #include "clang/Sema/Initialization.h"
26 #include "clang/Sema/SemaHLSL.h"
27 #include "clang/Sema/SemaObjC.h"
28 #include "clang/Sema/SemaRISCV.h"
29 #include "llvm/ADT/SmallVector.h"
30 #include "llvm/ADT/StringExtras.h"
31 #include <set>
32 using namespace clang;
33 
34 
35 
36 enum TryCastResult {
37   TC_NotApplicable, ///< The cast method is not applicable.
38   TC_Success,       ///< The cast method is appropriate and successful.
39   TC_Extension,     ///< The cast method is appropriate and accepted as a
40                     ///< language extension.
41   TC_Failed         ///< The cast method is appropriate, but failed. A
42                     ///< diagnostic has been emitted.
43 };
44 
isValidCast(TryCastResult TCR)45 static bool isValidCast(TryCastResult TCR) {
46   return TCR == TC_Success || TCR == TC_Extension;
47 }
48 
49 enum CastType {
50   CT_Const,       ///< const_cast
51   CT_Static,      ///< static_cast
52   CT_Reinterpret, ///< reinterpret_cast
53   CT_Dynamic,     ///< dynamic_cast
54   CT_CStyle,      ///< (Type)expr
55   CT_Functional,  ///< Type(expr)
56   CT_Addrspace    ///< addrspace_cast
57 };
58 
59 namespace {
60   struct CastOperation {
CastOperation__anone2be92000111::CastOperation61     CastOperation(Sema &S, QualType destType, ExprResult src)
62       : Self(S), SrcExpr(src), DestType(destType),
63         ResultType(destType.getNonLValueExprType(S.Context)),
64         ValueKind(Expr::getValueKindForType(destType)),
65         Kind(CK_Dependent), IsARCUnbridgedCast(false) {
66 
67       // C++ [expr.type]/8.2.2:
68       //   If a pr-value initially has the type cv-T, where T is a
69       //   cv-unqualified non-class, non-array type, the type of the
70       //   expression is adjusted to T prior to any further analysis.
71       // C23 6.5.4p6:
72       //   Preceding an expression by a parenthesized type name converts the
73       //   value of the expression to the unqualified, non-atomic version of
74       //   the named type.
75       // Don't drop __ptrauth qualifiers. We want to treat casting to a
76       // __ptrauth-qualified type as an error instead of implicitly ignoring
77       // the qualifier.
78       if (!S.Context.getLangOpts().ObjC && !DestType->isRecordType() &&
79           !DestType->isArrayType() && !DestType.getPointerAuth()) {
80         DestType = DestType.getAtomicUnqualifiedType();
81       }
82 
83       if (const BuiltinType *placeholder =
84             src.get()->getType()->getAsPlaceholderType()) {
85         PlaceholderKind = placeholder->getKind();
86       } else {
87         PlaceholderKind = (BuiltinType::Kind) 0;
88       }
89     }
90 
91     Sema &Self;
92     ExprResult SrcExpr;
93     QualType DestType;
94     QualType ResultType;
95     ExprValueKind ValueKind;
96     CastKind Kind;
97     BuiltinType::Kind PlaceholderKind;
98     CXXCastPath BasePath;
99     bool IsARCUnbridgedCast;
100 
101     struct OpRangeType {
102       SourceLocation Locations[3];
103 
OpRangeType__anone2be92000111::CastOperation::OpRangeType104       OpRangeType(SourceLocation Begin, SourceLocation LParen,
105                   SourceLocation RParen)
106           : Locations{Begin, LParen, RParen} {}
107 
108       OpRangeType() = default;
109 
getBegin__anone2be92000111::CastOperation::OpRangeType110       SourceLocation getBegin() const { return Locations[0]; }
111 
getLParenLoc__anone2be92000111::CastOperation::OpRangeType112       SourceLocation getLParenLoc() const { return Locations[1]; }
113 
getRParenLoc__anone2be92000111::CastOperation::OpRangeType114       SourceLocation getRParenLoc() const { return Locations[2]; }
115 
116       friend const StreamingDiagnostic &
operator <<__anone2be92000111::CastOperation117       operator<<(const StreamingDiagnostic &DB, OpRangeType Op) {
118         return DB << SourceRange(Op);
119       }
120 
getParenRange__anone2be92000111::CastOperation::OpRangeType121       SourceRange getParenRange() const {
122         return SourceRange(getLParenLoc(), getRParenLoc());
123       }
124 
operator SourceRange__anone2be92000111::CastOperation::OpRangeType125       operator SourceRange() const {
126         return SourceRange(getBegin(), getRParenLoc());
127       }
128     };
129 
130     OpRangeType OpRange;
131     SourceRange DestRange;
132 
133     // Top-level semantics-checking routines.
134     void CheckConstCast();
135     void CheckReinterpretCast();
136     void CheckStaticCast();
137     void CheckDynamicCast();
138     void CheckCXXCStyleCast(bool FunctionalCast, bool ListInitialization);
139     bool CheckHLSLCStyleCast(CheckedConversionKind CCK);
140     void CheckCStyleCast();
141     void CheckBuiltinBitCast();
142     void CheckAddrspaceCast();
143 
updatePartOfExplicitCastFlags__anone2be92000111::CastOperation144     void updatePartOfExplicitCastFlags(CastExpr *CE) {
145       // Walk down from the CE to the OrigSrcExpr, and mark all immediate
146       // ImplicitCastExpr's as being part of ExplicitCastExpr. The original CE
147       // (which is a ExplicitCastExpr), and the OrigSrcExpr are not touched.
148       for (; auto *ICE = dyn_cast<ImplicitCastExpr>(CE->getSubExpr()); CE = ICE)
149         ICE->setIsPartOfExplicitCast(true);
150     }
151 
152     /// Complete an apparently-successful cast operation that yields
153     /// the given expression.
complete__anone2be92000111::CastOperation154     ExprResult complete(CastExpr *castExpr) {
155       // If this is an unbridged cast, wrap the result in an implicit
156       // cast that yields the unbridged-cast placeholder type.
157       if (IsARCUnbridgedCast) {
158         castExpr = ImplicitCastExpr::Create(
159             Self.Context, Self.Context.ARCUnbridgedCastTy, CK_Dependent,
160             castExpr, nullptr, castExpr->getValueKind(),
161             Self.CurFPFeatureOverrides());
162       }
163       updatePartOfExplicitCastFlags(castExpr);
164       return castExpr;
165     }
166 
167     // Internal convenience methods.
168 
169     /// Try to handle the given placeholder expression kind.  Return
170     /// true if the source expression has the appropriate placeholder
171     /// kind.  A placeholder can only be claimed once.
claimPlaceholder__anone2be92000111::CastOperation172     bool claimPlaceholder(BuiltinType::Kind K) {
173       if (PlaceholderKind != K) return false;
174 
175       PlaceholderKind = (BuiltinType::Kind) 0;
176       return true;
177     }
178 
isPlaceholder__anone2be92000111::CastOperation179     bool isPlaceholder() const {
180       return PlaceholderKind != 0;
181     }
isPlaceholder__anone2be92000111::CastOperation182     bool isPlaceholder(BuiltinType::Kind K) const {
183       return PlaceholderKind == K;
184     }
185 
186     // Language specific cast restrictions for address spaces.
187     void checkAddressSpaceCast(QualType SrcType, QualType DestType);
188 
checkCastAlign__anone2be92000111::CastOperation189     void checkCastAlign() {
190       Self.CheckCastAlign(SrcExpr.get(), DestType, OpRange);
191     }
192 
checkObjCConversion__anone2be92000111::CastOperation193     void checkObjCConversion(CheckedConversionKind CCK,
194                              bool IsReinterpretCast = false) {
195       assert(Self.getLangOpts().allowsNonTrivialObjCLifetimeQualifiers());
196 
197       Expr *src = SrcExpr.get();
198       if (Self.ObjC().CheckObjCConversion(
199               OpRange, DestType, src, CCK, true, false, BO_PtrMemD,
200               IsReinterpretCast) == SemaObjC::ACR_unbridged)
201         IsARCUnbridgedCast = true;
202       SrcExpr = src;
203     }
204 
checkQualifiedDestType__anone2be92000111::CastOperation205     void checkQualifiedDestType() {
206       // Destination type may not be qualified with __ptrauth.
207       if (DestType.getPointerAuth()) {
208         Self.Diag(DestRange.getBegin(), diag::err_ptrauth_qualifier_cast)
209             << DestType << DestRange;
210       }
211     }
212 
213     /// Check for and handle non-overload placeholder expressions.
checkNonOverloadPlaceholders__anone2be92000111::CastOperation214     void checkNonOverloadPlaceholders() {
215       if (!isPlaceholder() || isPlaceholder(BuiltinType::Overload))
216         return;
217 
218       SrcExpr = Self.CheckPlaceholderExpr(SrcExpr.get());
219       if (SrcExpr.isInvalid())
220         return;
221       PlaceholderKind = (BuiltinType::Kind) 0;
222     }
223   };
224 
CheckNoDeref(Sema & S,const QualType FromType,const QualType ToType,SourceLocation OpLoc)225   void CheckNoDeref(Sema &S, const QualType FromType, const QualType ToType,
226                     SourceLocation OpLoc) {
227     if (const auto *PtrType = dyn_cast<PointerType>(FromType)) {
228       if (PtrType->getPointeeType()->hasAttr(attr::NoDeref)) {
229         if (const auto *DestType = dyn_cast<PointerType>(ToType)) {
230           if (!DestType->getPointeeType()->hasAttr(attr::NoDeref)) {
231             S.Diag(OpLoc, diag::warn_noderef_to_dereferenceable_pointer);
232           }
233         }
234       }
235     }
236   }
237 
238   struct CheckNoDerefRAII {
CheckNoDerefRAII__anone2be92000111::CheckNoDerefRAII239     CheckNoDerefRAII(CastOperation &Op) : Op(Op) {}
~CheckNoDerefRAII__anone2be92000111::CheckNoDerefRAII240     ~CheckNoDerefRAII() {
241       if (!Op.SrcExpr.isInvalid())
242         CheckNoDeref(Op.Self, Op.SrcExpr.get()->getType(), Op.ResultType,
243                      Op.OpRange.getBegin());
244     }
245 
246     CastOperation &Op;
247   };
248 }
249 
250 static void DiagnoseCastQual(Sema &Self, const ExprResult &SrcExpr,
251                              QualType DestType);
252 
253 // The Try functions attempt a specific way of casting. If they succeed, they
254 // return TC_Success. If their way of casting is not appropriate for the given
255 // arguments, they return TC_NotApplicable and *may* set diag to a diagnostic
256 // to emit if no other way succeeds. If their way of casting is appropriate but
257 // fails, they return TC_Failed and *must* set diag; they can set it to 0 if
258 // they emit a specialized diagnostic.
259 // All diagnostics returned by these functions must expect the same three
260 // arguments:
261 // %0: Cast Type (a value from the CastType enumeration)
262 // %1: Source Type
263 // %2: Destination Type
264 static TryCastResult TryLValueToRValueCast(Sema &Self, Expr *SrcExpr,
265                                            QualType DestType, bool CStyle,
266                                            SourceRange OpRange, CastKind &Kind,
267                                            CXXCastPath &BasePath,
268                                            unsigned &msg);
269 static TryCastResult
270 TryStaticReferenceDowncast(Sema &Self, Expr *SrcExpr, QualType DestType,
271                            bool CStyle, CastOperation::OpRangeType OpRange,
272                            unsigned &msg, CastKind &Kind,
273                            CXXCastPath &BasePath);
274 static TryCastResult
275 TryStaticPointerDowncast(Sema &Self, QualType SrcType, QualType DestType,
276                          bool CStyle, CastOperation::OpRangeType OpRange,
277                          unsigned &msg, CastKind &Kind, CXXCastPath &BasePath);
278 static TryCastResult TryStaticDowncast(Sema &Self, CanQualType SrcType,
279                                        CanQualType DestType, bool CStyle,
280                                        CastOperation::OpRangeType OpRange,
281                                        QualType OrigSrcType,
282                                        QualType OrigDestType, unsigned &msg,
283                                        CastKind &Kind, CXXCastPath &BasePath);
284 static TryCastResult
285 TryStaticMemberPointerUpcast(Sema &Self, ExprResult &SrcExpr, QualType SrcType,
286                              QualType DestType, bool CStyle,
287                              CastOperation::OpRangeType OpRange, unsigned &msg,
288                              CastKind &Kind, CXXCastPath &BasePath);
289 
290 static TryCastResult TryStaticImplicitCast(Sema &Self, ExprResult &SrcExpr,
291                                            QualType DestType,
292                                            CheckedConversionKind CCK,
293                                            CastOperation::OpRangeType OpRange,
294                                            unsigned &msg, CastKind &Kind,
295                                            bool ListInitialization);
296 static TryCastResult TryStaticCast(Sema &Self, ExprResult &SrcExpr,
297                                    QualType DestType, CheckedConversionKind CCK,
298                                    CastOperation::OpRangeType OpRange,
299                                    unsigned &msg, CastKind &Kind,
300                                    CXXCastPath &BasePath,
301                                    bool ListInitialization);
302 static TryCastResult TryConstCast(Sema &Self, ExprResult &SrcExpr,
303                                   QualType DestType, bool CStyle,
304                                   unsigned &msg);
305 static TryCastResult TryReinterpretCast(Sema &Self, ExprResult &SrcExpr,
306                                         QualType DestType, bool CStyle,
307                                         CastOperation::OpRangeType OpRange,
308                                         unsigned &msg, CastKind &Kind);
309 static TryCastResult TryAddressSpaceCast(Sema &Self, ExprResult &SrcExpr,
310                                          QualType DestType, bool CStyle,
311                                          unsigned &msg, CastKind &Kind);
312 
313 ExprResult
ActOnCXXNamedCast(SourceLocation OpLoc,tok::TokenKind Kind,SourceLocation LAngleBracketLoc,Declarator & D,SourceLocation RAngleBracketLoc,SourceLocation LParenLoc,Expr * E,SourceLocation RParenLoc)314 Sema::ActOnCXXNamedCast(SourceLocation OpLoc, tok::TokenKind Kind,
315                         SourceLocation LAngleBracketLoc, Declarator &D,
316                         SourceLocation RAngleBracketLoc,
317                         SourceLocation LParenLoc, Expr *E,
318                         SourceLocation RParenLoc) {
319 
320   assert(!D.isInvalidType());
321 
322   TypeSourceInfo *TInfo = GetTypeForDeclaratorCast(D, E->getType());
323   if (D.isInvalidType())
324     return ExprError();
325 
326   if (getLangOpts().CPlusPlus) {
327     // Check that there are no default arguments (C++ only).
328     CheckExtraCXXDefaultArguments(D);
329   }
330 
331   return BuildCXXNamedCast(OpLoc, Kind, TInfo, E,
332                            SourceRange(LAngleBracketLoc, RAngleBracketLoc),
333                            SourceRange(LParenLoc, RParenLoc));
334 }
335 
336 ExprResult
BuildCXXNamedCast(SourceLocation OpLoc,tok::TokenKind Kind,TypeSourceInfo * DestTInfo,Expr * E,SourceRange AngleBrackets,SourceRange Parens)337 Sema::BuildCXXNamedCast(SourceLocation OpLoc, tok::TokenKind Kind,
338                         TypeSourceInfo *DestTInfo, Expr *E,
339                         SourceRange AngleBrackets, SourceRange Parens) {
340   ExprResult Ex = E;
341   QualType DestType = DestTInfo->getType();
342 
343   // If the type is dependent, we won't do the semantic analysis now.
344   bool TypeDependent =
345       DestType->isDependentType() || Ex.get()->isTypeDependent();
346 
347   CastOperation Op(*this, DestType, E);
348   Op.OpRange =
349       CastOperation::OpRangeType(OpLoc, Parens.getBegin(), Parens.getEnd());
350   Op.DestRange = AngleBrackets;
351 
352   Op.checkQualifiedDestType();
353 
354   switch (Kind) {
355   default: llvm_unreachable("Unknown C++ cast!");
356 
357   case tok::kw_addrspace_cast:
358     if (!TypeDependent) {
359       Op.CheckAddrspaceCast();
360       if (Op.SrcExpr.isInvalid())
361         return ExprError();
362     }
363     return Op.complete(CXXAddrspaceCastExpr::Create(
364         Context, Op.ResultType, Op.ValueKind, Op.Kind, Op.SrcExpr.get(),
365         DestTInfo, OpLoc, Parens.getEnd(), AngleBrackets));
366 
367   case tok::kw_const_cast:
368     if (!TypeDependent) {
369       Op.CheckConstCast();
370       if (Op.SrcExpr.isInvalid())
371         return ExprError();
372       DiscardMisalignedMemberAddress(DestType.getTypePtr(), E);
373     }
374     return Op.complete(CXXConstCastExpr::Create(Context, Op.ResultType,
375                                   Op.ValueKind, Op.SrcExpr.get(), DestTInfo,
376                                                 OpLoc, Parens.getEnd(),
377                                                 AngleBrackets));
378 
379   case tok::kw_dynamic_cast: {
380     // dynamic_cast is not supported in C++ for OpenCL.
381     if (getLangOpts().OpenCLCPlusPlus) {
382       return ExprError(Diag(OpLoc, diag::err_openclcxx_not_supported)
383                        << "dynamic_cast");
384     }
385 
386     if (!TypeDependent) {
387       Op.CheckDynamicCast();
388       if (Op.SrcExpr.isInvalid())
389         return ExprError();
390     }
391     return Op.complete(CXXDynamicCastExpr::Create(Context, Op.ResultType,
392                                     Op.ValueKind, Op.Kind, Op.SrcExpr.get(),
393                                                   &Op.BasePath, DestTInfo,
394                                                   OpLoc, Parens.getEnd(),
395                                                   AngleBrackets));
396   }
397   case tok::kw_reinterpret_cast: {
398     if (!TypeDependent) {
399       Op.CheckReinterpretCast();
400       if (Op.SrcExpr.isInvalid())
401         return ExprError();
402       DiscardMisalignedMemberAddress(DestType.getTypePtr(), E);
403     }
404     return Op.complete(CXXReinterpretCastExpr::Create(Context, Op.ResultType,
405                                     Op.ValueKind, Op.Kind, Op.SrcExpr.get(),
406                                                       nullptr, DestTInfo, OpLoc,
407                                                       Parens.getEnd(),
408                                                       AngleBrackets));
409   }
410   case tok::kw_static_cast: {
411     if (!TypeDependent) {
412       Op.CheckStaticCast();
413       if (Op.SrcExpr.isInvalid())
414         return ExprError();
415       DiscardMisalignedMemberAddress(DestType.getTypePtr(), E);
416     }
417 
418     return Op.complete(CXXStaticCastExpr::Create(
419         Context, Op.ResultType, Op.ValueKind, Op.Kind, Op.SrcExpr.get(),
420         &Op.BasePath, DestTInfo, CurFPFeatureOverrides(), OpLoc,
421         Parens.getEnd(), AngleBrackets));
422   }
423   }
424 }
425 
ActOnBuiltinBitCastExpr(SourceLocation KWLoc,Declarator & D,ExprResult Operand,SourceLocation RParenLoc)426 ExprResult Sema::ActOnBuiltinBitCastExpr(SourceLocation KWLoc, Declarator &D,
427                                          ExprResult Operand,
428                                          SourceLocation RParenLoc) {
429   assert(!D.isInvalidType());
430 
431   TypeSourceInfo *TInfo = GetTypeForDeclaratorCast(D, Operand.get()->getType());
432   if (D.isInvalidType())
433     return ExprError();
434 
435   return BuildBuiltinBitCastExpr(KWLoc, TInfo, Operand.get(), RParenLoc);
436 }
437 
BuildBuiltinBitCastExpr(SourceLocation KWLoc,TypeSourceInfo * TSI,Expr * Operand,SourceLocation RParenLoc)438 ExprResult Sema::BuildBuiltinBitCastExpr(SourceLocation KWLoc,
439                                          TypeSourceInfo *TSI, Expr *Operand,
440                                          SourceLocation RParenLoc) {
441   CastOperation Op(*this, TSI->getType(), Operand);
442   Op.OpRange = CastOperation::OpRangeType(KWLoc, KWLoc, RParenLoc);
443   TypeLoc TL = TSI->getTypeLoc();
444   Op.DestRange = SourceRange(TL.getBeginLoc(), TL.getEndLoc());
445 
446   if (!Operand->isTypeDependent() && !TSI->getType()->isDependentType()) {
447     Op.CheckBuiltinBitCast();
448     if (Op.SrcExpr.isInvalid())
449       return ExprError();
450   }
451 
452   BuiltinBitCastExpr *BCE =
453       new (Context) BuiltinBitCastExpr(Op.ResultType, Op.ValueKind, Op.Kind,
454                                        Op.SrcExpr.get(), TSI, KWLoc, RParenLoc);
455   return Op.complete(BCE);
456 }
457 
458 /// Try to diagnose a failed overloaded cast.  Returns true if
459 /// diagnostics were emitted.
tryDiagnoseOverloadedCast(Sema & S,CastType CT,CastOperation::OpRangeType range,Expr * src,QualType destType,bool listInitialization)460 static bool tryDiagnoseOverloadedCast(Sema &S, CastType CT,
461                                       CastOperation::OpRangeType range,
462                                       Expr *src, QualType destType,
463                                       bool listInitialization) {
464   switch (CT) {
465   // These cast kinds don't consider user-defined conversions.
466   case CT_Const:
467   case CT_Reinterpret:
468   case CT_Dynamic:
469   case CT_Addrspace:
470     return false;
471 
472   // These do.
473   case CT_Static:
474   case CT_CStyle:
475   case CT_Functional:
476     break;
477   }
478 
479   QualType srcType = src->getType();
480   if (!destType->isRecordType() && !srcType->isRecordType())
481     return false;
482 
483   InitializedEntity entity = InitializedEntity::InitializeTemporary(destType);
484   InitializationKind initKind =
485       (CT == CT_CStyle) ? InitializationKind::CreateCStyleCast(
486                               range.getBegin(), range, listInitialization)
487       : (CT == CT_Functional)
488           ? InitializationKind::CreateFunctionalCast(
489                 range.getBegin(), range.getParenRange(), listInitialization)
490           : InitializationKind::CreateCast(/*type range?*/ range);
491   InitializationSequence sequence(S, entity, initKind, src);
492 
493   // It could happen that a constructor failed to be used because
494   // it requires a temporary of a broken type. Still, it will be found when
495   // looking for a match.
496   if (!sequence.Failed())
497     return false;
498 
499   switch (sequence.getFailureKind()) {
500   default: return false;
501 
502   case InitializationSequence::FK_ParenthesizedListInitFailed:
503     // In C++20, if the underlying destination type is a RecordType, Clang
504     // attempts to perform parentesized aggregate initialization if constructor
505     // overload fails:
506     //
507     // C++20 [expr.static.cast]p4:
508     //   An expression E can be explicitly converted to a type T...if overload
509     //   resolution for a direct-initialization...would find at least one viable
510     //   function ([over.match.viable]), or if T is an aggregate type having a
511     //   first element X and there is an implicit conversion sequence from E to
512     //   the type of X.
513     //
514     // If that fails, then we'll generate the diagnostics from the failed
515     // previous constructor overload attempt. Array initialization, however, is
516     // not done after attempting constructor overloading, so we exit as there
517     // won't be a failed overload result.
518     if (destType->isArrayType())
519       return false;
520     break;
521   case InitializationSequence::FK_ConstructorOverloadFailed:
522   case InitializationSequence::FK_UserConversionOverloadFailed:
523     break;
524   }
525 
526   OverloadCandidateSet &candidates = sequence.getFailedCandidateSet();
527 
528   unsigned msg = 0;
529   OverloadCandidateDisplayKind howManyCandidates = OCD_AllCandidates;
530 
531   switch (sequence.getFailedOverloadResult()) {
532   case OR_Success: llvm_unreachable("successful failed overload");
533   case OR_No_Viable_Function:
534     if (candidates.empty())
535       msg = diag::err_ovl_no_conversion_in_cast;
536     else
537       msg = diag::err_ovl_no_viable_conversion_in_cast;
538     howManyCandidates = OCD_AllCandidates;
539     break;
540 
541   case OR_Ambiguous:
542     msg = diag::err_ovl_ambiguous_conversion_in_cast;
543     howManyCandidates = OCD_AmbiguousCandidates;
544     break;
545 
546   case OR_Deleted: {
547     OverloadCandidateSet::iterator Best;
548     [[maybe_unused]] OverloadingResult Res =
549         candidates.BestViableFunction(S, range.getBegin(), Best);
550     assert(Res == OR_Deleted && "Inconsistent overload resolution");
551 
552     StringLiteral *Msg = Best->Function->getDeletedMessage();
553     candidates.NoteCandidates(
554         PartialDiagnosticAt(range.getBegin(),
555                             S.PDiag(diag::err_ovl_deleted_conversion_in_cast)
556                                 << CT << srcType << destType << (Msg != nullptr)
557                                 << (Msg ? Msg->getString() : StringRef())
558                                 << range << src->getSourceRange()),
559         S, OCD_ViableCandidates, src);
560     return true;
561   }
562   }
563 
564   candidates.NoteCandidates(
565       PartialDiagnosticAt(range.getBegin(),
566                           S.PDiag(msg) << CT << srcType << destType << range
567                                        << src->getSourceRange()),
568       S, howManyCandidates, src);
569 
570   return true;
571 }
572 
573 /// Diagnose a failed cast.
diagnoseBadCast(Sema & S,unsigned msg,CastType castType,CastOperation::OpRangeType opRange,Expr * src,QualType destType,bool listInitialization)574 static void diagnoseBadCast(Sema &S, unsigned msg, CastType castType,
575                             CastOperation::OpRangeType opRange, Expr *src,
576                             QualType destType, bool listInitialization) {
577   if (msg == diag::err_bad_cxx_cast_generic &&
578       tryDiagnoseOverloadedCast(S, castType, opRange, src, destType,
579                                 listInitialization))
580     return;
581 
582   S.Diag(opRange.getBegin(), msg) << castType
583     << src->getType() << destType << opRange << src->getSourceRange();
584 
585   // Detect if both types are (ptr to) class, and note any incompleteness.
586   int DifferentPtrness = 0;
587   QualType From = destType;
588   if (auto Ptr = From->getAs<PointerType>()) {
589     From = Ptr->getPointeeType();
590     DifferentPtrness++;
591   }
592   QualType To = src->getType();
593   if (auto Ptr = To->getAs<PointerType>()) {
594     To = Ptr->getPointeeType();
595     DifferentPtrness--;
596   }
597   if (!DifferentPtrness) {
598     auto RecFrom = From->getAs<RecordType>();
599     auto RecTo = To->getAs<RecordType>();
600     if (RecFrom && RecTo) {
601       auto DeclFrom = RecFrom->getAsCXXRecordDecl();
602       if (!DeclFrom->isCompleteDefinition())
603         S.Diag(DeclFrom->getLocation(), diag::note_type_incomplete) << DeclFrom;
604       auto DeclTo = RecTo->getAsCXXRecordDecl();
605       if (!DeclTo->isCompleteDefinition())
606         S.Diag(DeclTo->getLocation(), diag::note_type_incomplete) << DeclTo;
607     }
608   }
609 }
610 
611 namespace {
612 /// The kind of unwrapping we did when determining whether a conversion casts
613 /// away constness.
614 enum CastAwayConstnessKind {
615   /// The conversion does not cast away constness.
616   CACK_None = 0,
617   /// We unwrapped similar types.
618   CACK_Similar = 1,
619   /// We unwrapped dissimilar types with similar representations (eg, a pointer
620   /// versus an Objective-C object pointer).
621   CACK_SimilarKind = 2,
622   /// We unwrapped representationally-unrelated types, such as a pointer versus
623   /// a pointer-to-member.
624   CACK_Incoherent = 3,
625 };
626 }
627 
628 /// Unwrap one level of types for CastsAwayConstness.
629 ///
630 /// Like Sema::UnwrapSimilarTypes, this removes one level of indirection from
631 /// both types, provided that they're both pointer-like or array-like. Unlike
632 /// the Sema function, doesn't care if the unwrapped pieces are related.
633 ///
634 /// This function may remove additional levels as necessary for correctness:
635 /// the resulting T1 is unwrapped sufficiently that it is never an array type,
636 /// so that its qualifiers can be directly compared to those of T2 (which will
637 /// have the combined set of qualifiers from all indermediate levels of T2),
638 /// as (effectively) required by [expr.const.cast]p7 replacing T1's qualifiers
639 /// with those from T2.
640 static CastAwayConstnessKind
unwrapCastAwayConstnessLevel(ASTContext & Context,QualType & T1,QualType & T2)641 unwrapCastAwayConstnessLevel(ASTContext &Context, QualType &T1, QualType &T2) {
642   enum { None, Ptr, MemPtr, BlockPtr, Array };
643   auto Classify = [](QualType T) {
644     if (T->isAnyPointerType()) return Ptr;
645     if (T->isMemberPointerType()) return MemPtr;
646     if (T->isBlockPointerType()) return BlockPtr;
647     // We somewhat-arbitrarily don't look through VLA types here. This is at
648     // least consistent with the behavior of UnwrapSimilarTypes.
649     if (T->isConstantArrayType() || T->isIncompleteArrayType()) return Array;
650     return None;
651   };
652 
653   auto Unwrap = [&](QualType T) {
654     if (auto *AT = Context.getAsArrayType(T))
655       return AT->getElementType();
656     return T->getPointeeType();
657   };
658 
659   CastAwayConstnessKind Kind;
660 
661   if (T2->isReferenceType()) {
662     // Special case: if the destination type is a reference type, unwrap it as
663     // the first level. (The source will have been an lvalue expression in this
664     // case, so there is no corresponding "reference to" in T1 to remove.) This
665     // simulates removing a "pointer to" from both sides.
666     T2 = T2->getPointeeType();
667     Kind = CastAwayConstnessKind::CACK_Similar;
668   } else if (Context.UnwrapSimilarTypes(T1, T2)) {
669     Kind = CastAwayConstnessKind::CACK_Similar;
670   } else {
671     // Try unwrapping mismatching levels.
672     int T1Class = Classify(T1);
673     if (T1Class == None)
674       return CastAwayConstnessKind::CACK_None;
675 
676     int T2Class = Classify(T2);
677     if (T2Class == None)
678       return CastAwayConstnessKind::CACK_None;
679 
680     T1 = Unwrap(T1);
681     T2 = Unwrap(T2);
682     Kind = T1Class == T2Class ? CastAwayConstnessKind::CACK_SimilarKind
683                               : CastAwayConstnessKind::CACK_Incoherent;
684   }
685 
686   // We've unwrapped at least one level. If the resulting T1 is a (possibly
687   // multidimensional) array type, any qualifier on any matching layer of
688   // T2 is considered to correspond to T1. Decompose down to the element
689   // type of T1 so that we can compare properly.
690   while (true) {
691     Context.UnwrapSimilarArrayTypes(T1, T2);
692 
693     if (Classify(T1) != Array)
694       break;
695 
696     auto T2Class = Classify(T2);
697     if (T2Class == None)
698       break;
699 
700     if (T2Class != Array)
701       Kind = CastAwayConstnessKind::CACK_Incoherent;
702     else if (Kind != CastAwayConstnessKind::CACK_Incoherent)
703       Kind = CastAwayConstnessKind::CACK_SimilarKind;
704 
705     T1 = Unwrap(T1);
706     T2 = Unwrap(T2).withCVRQualifiers(T2.getCVRQualifiers());
707   }
708 
709   return Kind;
710 }
711 
712 /// Check if the pointer conversion from SrcType to DestType casts away
713 /// constness as defined in C++ [expr.const.cast]. This is used by the cast
714 /// checkers. Both arguments must denote pointer (possibly to member) types.
715 ///
716 /// \param CheckCVR Whether to check for const/volatile/restrict qualifiers.
717 /// \param CheckObjCLifetime Whether to check Objective-C lifetime qualifiers.
718 static CastAwayConstnessKind
CastsAwayConstness(Sema & Self,QualType SrcType,QualType DestType,bool CheckCVR,bool CheckObjCLifetime,QualType * TheOffendingSrcType=nullptr,QualType * TheOffendingDestType=nullptr,Qualifiers * CastAwayQualifiers=nullptr)719 CastsAwayConstness(Sema &Self, QualType SrcType, QualType DestType,
720                    bool CheckCVR, bool CheckObjCLifetime,
721                    QualType *TheOffendingSrcType = nullptr,
722                    QualType *TheOffendingDestType = nullptr,
723                    Qualifiers *CastAwayQualifiers = nullptr) {
724   // If the only checking we care about is for Objective-C lifetime qualifiers,
725   // and we're not in ObjC mode, there's nothing to check.
726   if (!CheckCVR && CheckObjCLifetime && !Self.Context.getLangOpts().ObjC)
727     return CastAwayConstnessKind::CACK_None;
728 
729   if (!DestType->isReferenceType()) {
730     assert((SrcType->isAnyPointerType() || SrcType->isMemberPointerType() ||
731             SrcType->isBlockPointerType()) &&
732            "Source type is not pointer or pointer to member.");
733     assert((DestType->isAnyPointerType() || DestType->isMemberPointerType() ||
734             DestType->isBlockPointerType()) &&
735            "Destination type is not pointer or pointer to member.");
736   }
737 
738   QualType UnwrappedSrcType = Self.Context.getCanonicalType(SrcType),
739            UnwrappedDestType = Self.Context.getCanonicalType(DestType);
740 
741   // Find the qualifiers. We only care about cvr-qualifiers for the
742   // purpose of this check, because other qualifiers (address spaces,
743   // Objective-C GC, etc.) are part of the type's identity.
744   QualType PrevUnwrappedSrcType = UnwrappedSrcType;
745   QualType PrevUnwrappedDestType = UnwrappedDestType;
746   auto WorstKind = CastAwayConstnessKind::CACK_Similar;
747   bool AllConstSoFar = true;
748   while (auto Kind = unwrapCastAwayConstnessLevel(
749              Self.Context, UnwrappedSrcType, UnwrappedDestType)) {
750     // Track the worst kind of unwrap we needed to do before we found a
751     // problem.
752     if (Kind > WorstKind)
753       WorstKind = Kind;
754 
755     // Determine the relevant qualifiers at this level.
756     Qualifiers SrcQuals, DestQuals;
757     Self.Context.getUnqualifiedArrayType(UnwrappedSrcType, SrcQuals);
758     Self.Context.getUnqualifiedArrayType(UnwrappedDestType, DestQuals);
759 
760     // We do not meaningfully track object const-ness of Objective-C object
761     // types. Remove const from the source type if either the source or
762     // the destination is an Objective-C object type.
763     if (UnwrappedSrcType->isObjCObjectType() ||
764         UnwrappedDestType->isObjCObjectType())
765       SrcQuals.removeConst();
766 
767     if (CheckCVR) {
768       Qualifiers SrcCvrQuals =
769           Qualifiers::fromCVRMask(SrcQuals.getCVRQualifiers());
770       Qualifiers DestCvrQuals =
771           Qualifiers::fromCVRMask(DestQuals.getCVRQualifiers());
772 
773       if (SrcCvrQuals != DestCvrQuals) {
774         if (CastAwayQualifiers)
775           *CastAwayQualifiers = SrcCvrQuals - DestCvrQuals;
776 
777         // If we removed a cvr-qualifier, this is casting away 'constness'.
778         if (!DestCvrQuals.compatiblyIncludes(SrcCvrQuals,
779                                              Self.getASTContext())) {
780           if (TheOffendingSrcType)
781             *TheOffendingSrcType = PrevUnwrappedSrcType;
782           if (TheOffendingDestType)
783             *TheOffendingDestType = PrevUnwrappedDestType;
784           return WorstKind;
785         }
786 
787         // If any prior level was not 'const', this is also casting away
788         // 'constness'. We noted the outermost type missing a 'const' already.
789         if (!AllConstSoFar)
790           return WorstKind;
791       }
792     }
793 
794     if (CheckObjCLifetime &&
795         !DestQuals.compatiblyIncludesObjCLifetime(SrcQuals))
796       return WorstKind;
797 
798     // If we found our first non-const-qualified type, this may be the place
799     // where things start to go wrong.
800     if (AllConstSoFar && !DestQuals.hasConst()) {
801       AllConstSoFar = false;
802       if (TheOffendingSrcType)
803         *TheOffendingSrcType = PrevUnwrappedSrcType;
804       if (TheOffendingDestType)
805         *TheOffendingDestType = PrevUnwrappedDestType;
806     }
807 
808     PrevUnwrappedSrcType = UnwrappedSrcType;
809     PrevUnwrappedDestType = UnwrappedDestType;
810   }
811 
812   return CastAwayConstnessKind::CACK_None;
813 }
814 
getCastAwayConstnessCastKind(CastAwayConstnessKind CACK,unsigned & DiagID)815 static TryCastResult getCastAwayConstnessCastKind(CastAwayConstnessKind CACK,
816                                                   unsigned &DiagID) {
817   switch (CACK) {
818   case CastAwayConstnessKind::CACK_None:
819     llvm_unreachable("did not cast away constness");
820 
821   case CastAwayConstnessKind::CACK_Similar:
822     // FIXME: Accept these as an extension too?
823   case CastAwayConstnessKind::CACK_SimilarKind:
824     DiagID = diag::err_bad_cxx_cast_qualifiers_away;
825     return TC_Failed;
826 
827   case CastAwayConstnessKind::CACK_Incoherent:
828     DiagID = diag::ext_bad_cxx_cast_qualifiers_away_incoherent;
829     return TC_Extension;
830   }
831 
832   llvm_unreachable("unexpected cast away constness kind");
833 }
834 
835 /// CheckDynamicCast - Check that a dynamic_cast\<DestType\>(SrcExpr) is valid.
836 /// Refer to C++ 5.2.7 for details. Dynamic casts are used mostly for runtime-
837 /// checked downcasts in class hierarchies.
CheckDynamicCast()838 void CastOperation::CheckDynamicCast() {
839   CheckNoDerefRAII NoderefCheck(*this);
840 
841   if (ValueKind == VK_PRValue)
842     SrcExpr = Self.DefaultFunctionArrayLvalueConversion(SrcExpr.get());
843   else if (isPlaceholder())
844     SrcExpr = Self.CheckPlaceholderExpr(SrcExpr.get());
845   if (SrcExpr.isInvalid()) // if conversion failed, don't report another error
846     return;
847 
848   QualType OrigSrcType = SrcExpr.get()->getType();
849   QualType DestType = Self.Context.getCanonicalType(this->DestType);
850 
851   // C++ 5.2.7p1: T shall be a pointer or reference to a complete class type,
852   //   or "pointer to cv void".
853 
854   QualType DestPointee;
855   const PointerType *DestPointer = DestType->getAs<PointerType>();
856   const ReferenceType *DestReference = nullptr;
857   if (DestPointer) {
858     DestPointee = DestPointer->getPointeeType();
859   } else if ((DestReference = DestType->getAs<ReferenceType>())) {
860     DestPointee = DestReference->getPointeeType();
861   } else {
862     Self.Diag(OpRange.getBegin(), diag::err_bad_dynamic_cast_not_ref_or_ptr)
863       << this->DestType << DestRange;
864     SrcExpr = ExprError();
865     return;
866   }
867 
868   const RecordType *DestRecord = DestPointee->getAs<RecordType>();
869   if (DestPointee->isVoidType()) {
870     assert(DestPointer && "Reference to void is not possible");
871   } else if (DestRecord) {
872     if (Self.RequireCompleteType(OpRange.getBegin(), DestPointee,
873                                  diag::err_bad_cast_incomplete,
874                                  DestRange)) {
875       SrcExpr = ExprError();
876       return;
877     }
878   } else {
879     Self.Diag(OpRange.getBegin(), diag::err_bad_dynamic_cast_not_class)
880       << DestPointee.getUnqualifiedType() << DestRange;
881     SrcExpr = ExprError();
882     return;
883   }
884 
885   // C++0x 5.2.7p2: If T is a pointer type, v shall be an rvalue of a pointer to
886   //   complete class type, [...]. If T is an lvalue reference type, v shall be
887   //   an lvalue of a complete class type, [...]. If T is an rvalue reference
888   //   type, v shall be an expression having a complete class type, [...]
889   QualType SrcType = Self.Context.getCanonicalType(OrigSrcType);
890   QualType SrcPointee;
891   if (DestPointer) {
892     if (const PointerType *SrcPointer = SrcType->getAs<PointerType>()) {
893       SrcPointee = SrcPointer->getPointeeType();
894     } else {
895       Self.Diag(OpRange.getBegin(), diag::err_bad_dynamic_cast_not_ptr)
896           << OrigSrcType << this->DestType << SrcExpr.get()->getSourceRange();
897       SrcExpr = ExprError();
898       return;
899     }
900   } else if (DestReference->isLValueReferenceType()) {
901     if (!SrcExpr.get()->isLValue()) {
902       Self.Diag(OpRange.getBegin(), diag::err_bad_cxx_cast_rvalue)
903         << CT_Dynamic << OrigSrcType << this->DestType << OpRange;
904     }
905     SrcPointee = SrcType;
906   } else {
907     // If we're dynamic_casting from a prvalue to an rvalue reference, we need
908     // to materialize the prvalue before we bind the reference to it.
909     if (SrcExpr.get()->isPRValue())
910       SrcExpr = Self.CreateMaterializeTemporaryExpr(
911           SrcType, SrcExpr.get(), /*IsLValueReference*/ false);
912     SrcPointee = SrcType;
913   }
914 
915   const RecordType *SrcRecord = SrcPointee->getAs<RecordType>();
916   if (SrcRecord) {
917     if (Self.RequireCompleteType(OpRange.getBegin(), SrcPointee,
918                                  diag::err_bad_cast_incomplete,
919                                  SrcExpr.get())) {
920       SrcExpr = ExprError();
921       return;
922     }
923   } else {
924     Self.Diag(OpRange.getBegin(), diag::err_bad_dynamic_cast_not_class)
925       << SrcPointee.getUnqualifiedType() << SrcExpr.get()->getSourceRange();
926     SrcExpr = ExprError();
927     return;
928   }
929 
930   assert((DestPointer || DestReference) &&
931     "Bad destination non-ptr/ref slipped through.");
932   assert((DestRecord || DestPointee->isVoidType()) &&
933     "Bad destination pointee slipped through.");
934   assert(SrcRecord && "Bad source pointee slipped through.");
935 
936   // C++ 5.2.7p1: The dynamic_cast operator shall not cast away constness.
937   if (!DestPointee.isAtLeastAsQualifiedAs(SrcPointee, Self.getASTContext())) {
938     Self.Diag(OpRange.getBegin(), diag::err_bad_cxx_cast_qualifiers_away)
939       << CT_Dynamic << OrigSrcType << this->DestType << OpRange;
940     SrcExpr = ExprError();
941     return;
942   }
943 
944   // C++ 5.2.7p3: If the type of v is the same as the required result type,
945   //   [except for cv].
946   if (DestRecord == SrcRecord) {
947     Kind = CK_NoOp;
948     return;
949   }
950 
951   // C++ 5.2.7p5
952   // Upcasts are resolved statically.
953   if (DestRecord &&
954       Self.IsDerivedFrom(OpRange.getBegin(), SrcPointee, DestPointee)) {
955     if (Self.CheckDerivedToBaseConversion(SrcPointee, DestPointee,
956                                            OpRange.getBegin(), OpRange,
957                                            &BasePath)) {
958       SrcExpr = ExprError();
959       return;
960     }
961 
962     Kind = CK_DerivedToBase;
963     return;
964   }
965 
966   // C++ 5.2.7p6: Otherwise, v shall be [polymorphic].
967   const RecordDecl *SrcDecl = SrcRecord->getDecl()->getDefinition();
968   assert(SrcDecl && "Definition missing");
969   if (!cast<CXXRecordDecl>(SrcDecl)->isPolymorphic()) {
970     Self.Diag(OpRange.getBegin(), diag::err_bad_dynamic_cast_not_polymorphic)
971       << SrcPointee.getUnqualifiedType() << SrcExpr.get()->getSourceRange();
972     SrcExpr = ExprError();
973   }
974 
975   // dynamic_cast is not available with -fno-rtti.
976   // As an exception, dynamic_cast to void* is available because it doesn't
977   // use RTTI.
978   if (!Self.getLangOpts().RTTI && !DestPointee->isVoidType()) {
979     Self.Diag(OpRange.getBegin(), diag::err_no_dynamic_cast_with_fno_rtti);
980     SrcExpr = ExprError();
981     return;
982   }
983 
984   // Warns when dynamic_cast is used with RTTI data disabled.
985   if (!Self.getLangOpts().RTTIData) {
986     bool MicrosoftABI =
987         Self.getASTContext().getTargetInfo().getCXXABI().isMicrosoft();
988     bool isClangCL = Self.getDiagnostics().getDiagnosticOptions().getFormat() ==
989                      DiagnosticOptions::MSVC;
990     if (MicrosoftABI || !DestPointee->isVoidType())
991       Self.Diag(OpRange.getBegin(),
992                 diag::warn_no_dynamic_cast_with_rtti_disabled)
993           << isClangCL;
994   }
995 
996   // For a dynamic_cast to a final type, IR generation might emit a reference
997   // to the vtable.
998   if (DestRecord) {
999     auto *DestDecl = DestRecord->getAsCXXRecordDecl();
1000     if (DestDecl->isEffectivelyFinal())
1001       Self.MarkVTableUsed(OpRange.getBegin(), DestDecl);
1002   }
1003 
1004   // Done. Everything else is run-time checks.
1005   Kind = CK_Dynamic;
1006 }
1007 
1008 /// CheckConstCast - Check that a const_cast\<DestType\>(SrcExpr) is valid.
1009 /// Refer to C++ 5.2.11 for details. const_cast is typically used in code
1010 /// like this:
1011 /// const char *str = "literal";
1012 /// legacy_function(const_cast\<char*\>(str));
CheckConstCast()1013 void CastOperation::CheckConstCast() {
1014   CheckNoDerefRAII NoderefCheck(*this);
1015 
1016   if (ValueKind == VK_PRValue)
1017     SrcExpr = Self.DefaultFunctionArrayLvalueConversion(SrcExpr.get());
1018   else if (isPlaceholder())
1019     SrcExpr = Self.CheckPlaceholderExpr(SrcExpr.get());
1020   if (SrcExpr.isInvalid()) // if conversion failed, don't report another error
1021     return;
1022 
1023   unsigned msg = diag::err_bad_cxx_cast_generic;
1024   auto TCR = TryConstCast(Self, SrcExpr, DestType, /*CStyle*/ false, msg);
1025   if (TCR != TC_Success && msg != 0) {
1026     Self.Diag(OpRange.getBegin(), msg) << CT_Const
1027       << SrcExpr.get()->getType() << DestType << OpRange;
1028   }
1029   if (!isValidCast(TCR))
1030     SrcExpr = ExprError();
1031 }
1032 
CheckAddrspaceCast()1033 void CastOperation::CheckAddrspaceCast() {
1034   unsigned msg = diag::err_bad_cxx_cast_generic;
1035   auto TCR =
1036       TryAddressSpaceCast(Self, SrcExpr, DestType, /*CStyle*/ false, msg, Kind);
1037   if (TCR != TC_Success && msg != 0) {
1038     Self.Diag(OpRange.getBegin(), msg)
1039         << CT_Addrspace << SrcExpr.get()->getType() << DestType << OpRange;
1040   }
1041   if (!isValidCast(TCR))
1042     SrcExpr = ExprError();
1043 }
1044 
1045 /// Check that a reinterpret_cast\<DestType\>(SrcExpr) is not used as upcast
1046 /// or downcast between respective pointers or references.
DiagnoseReinterpretUpDownCast(Sema & Self,const Expr * SrcExpr,QualType DestType,CastOperation::OpRangeType OpRange)1047 static void DiagnoseReinterpretUpDownCast(Sema &Self, const Expr *SrcExpr,
1048                                           QualType DestType,
1049                                           CastOperation::OpRangeType OpRange) {
1050   QualType SrcType = SrcExpr->getType();
1051   // When casting from pointer or reference, get pointee type; use original
1052   // type otherwise.
1053   const CXXRecordDecl *SrcPointeeRD = SrcType->getPointeeCXXRecordDecl();
1054   const CXXRecordDecl *SrcRD =
1055     SrcPointeeRD ? SrcPointeeRD : SrcType->getAsCXXRecordDecl();
1056 
1057   // Examining subobjects for records is only possible if the complete and
1058   // valid definition is available.  Also, template instantiation is not
1059   // allowed here.
1060   if (!SrcRD || !SrcRD->isCompleteDefinition() || SrcRD->isInvalidDecl())
1061     return;
1062 
1063   const CXXRecordDecl *DestRD = DestType->getPointeeCXXRecordDecl();
1064 
1065   if (!DestRD || !DestRD->isCompleteDefinition() || DestRD->isInvalidDecl())
1066     return;
1067 
1068   enum {
1069     ReinterpretUpcast,
1070     ReinterpretDowncast
1071   } ReinterpretKind;
1072 
1073   CXXBasePaths BasePaths;
1074 
1075   if (SrcRD->isDerivedFrom(DestRD, BasePaths))
1076     ReinterpretKind = ReinterpretUpcast;
1077   else if (DestRD->isDerivedFrom(SrcRD, BasePaths))
1078     ReinterpretKind = ReinterpretDowncast;
1079   else
1080     return;
1081 
1082   bool VirtualBase = true;
1083   bool NonZeroOffset = false;
1084   for (CXXBasePaths::const_paths_iterator I = BasePaths.begin(),
1085                                           E = BasePaths.end();
1086        I != E; ++I) {
1087     const CXXBasePath &Path = *I;
1088     CharUnits Offset = CharUnits::Zero();
1089     bool IsVirtual = false;
1090     for (CXXBasePath::const_iterator IElem = Path.begin(), EElem = Path.end();
1091          IElem != EElem; ++IElem) {
1092       IsVirtual = IElem->Base->isVirtual();
1093       if (IsVirtual)
1094         break;
1095       const CXXRecordDecl *BaseRD = IElem->Base->getType()->getAsCXXRecordDecl();
1096       assert(BaseRD && "Base type should be a valid unqualified class type");
1097       // Don't check if any base has invalid declaration or has no definition
1098       // since it has no layout info.
1099       const CXXRecordDecl *Class = IElem->Class,
1100                           *ClassDefinition = Class->getDefinition();
1101       if (Class->isInvalidDecl() || !ClassDefinition ||
1102           !ClassDefinition->isCompleteDefinition())
1103         return;
1104 
1105       const ASTRecordLayout &DerivedLayout =
1106           Self.Context.getASTRecordLayout(Class);
1107       Offset += DerivedLayout.getBaseClassOffset(BaseRD);
1108     }
1109     if (!IsVirtual) {
1110       // Don't warn if any path is a non-virtually derived base at offset zero.
1111       if (Offset.isZero())
1112         return;
1113       // Offset makes sense only for non-virtual bases.
1114       else
1115         NonZeroOffset = true;
1116     }
1117     VirtualBase = VirtualBase && IsVirtual;
1118   }
1119 
1120   (void) NonZeroOffset; // Silence set but not used warning.
1121   assert((VirtualBase || NonZeroOffset) &&
1122          "Should have returned if has non-virtual base with zero offset");
1123 
1124   QualType BaseType =
1125       ReinterpretKind == ReinterpretUpcast? DestType : SrcType;
1126   QualType DerivedType =
1127       ReinterpretKind == ReinterpretUpcast? SrcType : DestType;
1128 
1129   SourceLocation BeginLoc = OpRange.getBegin();
1130   Self.Diag(BeginLoc, diag::warn_reinterpret_different_from_static)
1131     << DerivedType << BaseType << !VirtualBase << int(ReinterpretKind)
1132     << OpRange;
1133   Self.Diag(BeginLoc, diag::note_reinterpret_updowncast_use_static)
1134     << int(ReinterpretKind)
1135     << FixItHint::CreateReplacement(BeginLoc, "static_cast");
1136 }
1137 
argTypeIsABIEquivalent(QualType SrcType,QualType DestType,ASTContext & Context)1138 static bool argTypeIsABIEquivalent(QualType SrcType, QualType DestType,
1139                                    ASTContext &Context) {
1140   if (SrcType->isPointerType() && DestType->isPointerType())
1141     return true;
1142 
1143   // Allow integral type mismatch if their size are equal.
1144   if ((SrcType->isIntegralType(Context) || SrcType->isEnumeralType()) &&
1145       (DestType->isIntegralType(Context) || DestType->isEnumeralType()))
1146     if (Context.getTypeSizeInChars(SrcType) ==
1147         Context.getTypeSizeInChars(DestType))
1148       return true;
1149 
1150   return Context.hasSameUnqualifiedType(SrcType, DestType);
1151 }
1152 
checkCastFunctionType(Sema & Self,const ExprResult & SrcExpr,QualType DestType)1153 static unsigned int checkCastFunctionType(Sema &Self, const ExprResult &SrcExpr,
1154                                           QualType DestType) {
1155   unsigned int DiagID = 0;
1156   const unsigned int DiagList[] = {diag::warn_cast_function_type_strict,
1157                                    diag::warn_cast_function_type};
1158   for (auto ID : DiagList) {
1159     if (!Self.Diags.isIgnored(ID, SrcExpr.get()->getExprLoc())) {
1160       DiagID = ID;
1161       break;
1162     }
1163   }
1164   if (!DiagID)
1165     return 0;
1166 
1167   QualType SrcType = SrcExpr.get()->getType();
1168   const FunctionType *SrcFTy = nullptr;
1169   const FunctionType *DstFTy = nullptr;
1170   if (((SrcType->isBlockPointerType() || SrcType->isFunctionPointerType()) &&
1171        DestType->isFunctionPointerType()) ||
1172       (SrcType->isMemberFunctionPointerType() &&
1173        DestType->isMemberFunctionPointerType())) {
1174     SrcFTy = SrcType->getPointeeType()->castAs<FunctionType>();
1175     DstFTy = DestType->getPointeeType()->castAs<FunctionType>();
1176   } else if (SrcType->isFunctionType() && DestType->isFunctionReferenceType()) {
1177     SrcFTy = SrcType->castAs<FunctionType>();
1178     DstFTy = DestType.getNonReferenceType()->castAs<FunctionType>();
1179   } else {
1180     return 0;
1181   }
1182   assert(SrcFTy && DstFTy);
1183 
1184   if (Self.Context.hasSameType(SrcFTy, DstFTy))
1185     return 0;
1186 
1187   // For strict checks, ensure we have an exact match.
1188   if (DiagID == diag::warn_cast_function_type_strict)
1189     return DiagID;
1190 
1191   auto IsVoidVoid = [](const FunctionType *T) {
1192     if (!T->getReturnType()->isVoidType())
1193       return false;
1194     if (const auto *PT = T->getAs<FunctionProtoType>())
1195       return !PT->isVariadic() && PT->getNumParams() == 0;
1196     return false;
1197   };
1198 
1199   auto IsFarProc = [](const FunctionType *T) {
1200     // The definition of FARPROC depends on the platform in terms of its return
1201     // type, which could be int, or long long, etc. We'll look for a source
1202     // signature for: <integer type> (*)() and call that "close enough" to
1203     // FARPROC to be sufficient to silence the diagnostic. This is similar to
1204     // how we allow casts between function pointers and void * for supporting
1205     // dlsym.
1206     // Note: we could check for __stdcall on the function pointer as well, but
1207     // that seems like splitting hairs.
1208     if (!T->getReturnType()->isIntegerType())
1209       return false;
1210     if (const auto *PT = T->getAs<FunctionProtoType>())
1211       return !PT->isVariadic() && PT->getNumParams() == 0;
1212     return true;
1213   };
1214 
1215   // Skip if either function type is void(*)(void)
1216   if (IsVoidVoid(SrcFTy) || IsVoidVoid(DstFTy))
1217     return 0;
1218 
1219   // On Windows, GetProcAddress() returns a FARPROC, which is a typedef for a
1220   // function pointer type (with no prototype, in C). We don't want to diagnose
1221   // this case so we don't diagnose idiomatic code on Windows.
1222   if (Self.getASTContext().getTargetInfo().getTriple().isOSWindows() &&
1223       IsFarProc(SrcFTy))
1224     return 0;
1225 
1226   // Check return type.
1227   if (!argTypeIsABIEquivalent(SrcFTy->getReturnType(), DstFTy->getReturnType(),
1228                               Self.Context))
1229     return DiagID;
1230 
1231   // Check if either has unspecified number of parameters
1232   if (SrcFTy->isFunctionNoProtoType() || DstFTy->isFunctionNoProtoType())
1233     return 0;
1234 
1235   // Check parameter types.
1236 
1237   const auto *SrcFPTy = cast<FunctionProtoType>(SrcFTy);
1238   const auto *DstFPTy = cast<FunctionProtoType>(DstFTy);
1239 
1240   // In a cast involving function types with a variable argument list only the
1241   // types of initial arguments that are provided are considered.
1242   unsigned NumParams = SrcFPTy->getNumParams();
1243   unsigned DstNumParams = DstFPTy->getNumParams();
1244   if (NumParams > DstNumParams) {
1245     if (!DstFPTy->isVariadic())
1246       return DiagID;
1247     NumParams = DstNumParams;
1248   } else if (NumParams < DstNumParams) {
1249     if (!SrcFPTy->isVariadic())
1250       return DiagID;
1251   }
1252 
1253   for (unsigned i = 0; i < NumParams; ++i)
1254     if (!argTypeIsABIEquivalent(SrcFPTy->getParamType(i),
1255                                 DstFPTy->getParamType(i), Self.Context))
1256       return DiagID;
1257 
1258   return 0;
1259 }
1260 
1261 /// CheckReinterpretCast - Check that a reinterpret_cast\<DestType\>(SrcExpr) is
1262 /// valid.
1263 /// Refer to C++ 5.2.10 for details. reinterpret_cast is typically used in code
1264 /// like this:
1265 /// char *bytes = reinterpret_cast\<char*\>(int_ptr);
CheckReinterpretCast()1266 void CastOperation::CheckReinterpretCast() {
1267   if (ValueKind == VK_PRValue && !isPlaceholder(BuiltinType::Overload))
1268     SrcExpr = Self.DefaultFunctionArrayLvalueConversion(SrcExpr.get());
1269   else
1270     checkNonOverloadPlaceholders();
1271   if (SrcExpr.isInvalid()) // if conversion failed, don't report another error
1272     return;
1273 
1274   unsigned msg = diag::err_bad_cxx_cast_generic;
1275   TryCastResult tcr =
1276     TryReinterpretCast(Self, SrcExpr, DestType,
1277                        /*CStyle*/false, OpRange, msg, Kind);
1278   if (tcr != TC_Success && msg != 0) {
1279     if (SrcExpr.isInvalid()) // if conversion failed, don't report another error
1280       return;
1281     if (SrcExpr.get()->getType() == Self.Context.OverloadTy) {
1282       //FIXME: &f<int>; is overloaded and resolvable
1283       Self.Diag(OpRange.getBegin(), diag::err_bad_reinterpret_cast_overload)
1284         << OverloadExpr::find(SrcExpr.get()).Expression->getName()
1285         << DestType << OpRange;
1286       Self.NoteAllOverloadCandidates(SrcExpr.get());
1287 
1288     } else {
1289       diagnoseBadCast(Self, msg, CT_Reinterpret, OpRange, SrcExpr.get(),
1290                       DestType, /*listInitialization=*/false);
1291     }
1292   }
1293 
1294   if (isValidCast(tcr)) {
1295     if (Self.getLangOpts().allowsNonTrivialObjCLifetimeQualifiers())
1296       checkObjCConversion(CheckedConversionKind::OtherCast,
1297                           /*IsReinterpretCast=*/true);
1298     DiagnoseReinterpretUpDownCast(Self, SrcExpr.get(), DestType, OpRange);
1299 
1300     if (unsigned DiagID = checkCastFunctionType(Self, SrcExpr, DestType))
1301       Self.Diag(OpRange.getBegin(), DiagID)
1302           << SrcExpr.get()->getType() << DestType << OpRange;
1303   } else {
1304     SrcExpr = ExprError();
1305   }
1306 }
1307 
1308 
1309 /// CheckStaticCast - Check that a static_cast\<DestType\>(SrcExpr) is valid.
1310 /// Refer to C++ 5.2.9 for details. Static casts are mostly used for making
1311 /// implicit conversions explicit and getting rid of data loss warnings.
CheckStaticCast()1312 void CastOperation::CheckStaticCast() {
1313   CheckNoDerefRAII NoderefCheck(*this);
1314 
1315   if (isPlaceholder()) {
1316     checkNonOverloadPlaceholders();
1317     if (SrcExpr.isInvalid())
1318       return;
1319   }
1320 
1321   // This test is outside everything else because it's the only case where
1322   // a non-lvalue-reference target type does not lead to decay.
1323   // C++ 5.2.9p4: Any expression can be explicitly converted to type "cv void".
1324   if (DestType->isVoidType()) {
1325     Kind = CK_ToVoid;
1326 
1327     if (claimPlaceholder(BuiltinType::Overload)) {
1328       Self.ResolveAndFixSingleFunctionTemplateSpecialization(SrcExpr,
1329                 false, // Decay Function to ptr
1330                 true, // Complain
1331                 OpRange, DestType, diag::err_bad_static_cast_overload);
1332       if (SrcExpr.isInvalid())
1333         return;
1334     }
1335 
1336     SrcExpr = Self.IgnoredValueConversions(SrcExpr.get());
1337     return;
1338   }
1339 
1340   if (ValueKind == VK_PRValue && !DestType->isRecordType() &&
1341       !isPlaceholder(BuiltinType::Overload)) {
1342     SrcExpr = Self.DefaultFunctionArrayLvalueConversion(SrcExpr.get());
1343     if (SrcExpr.isInvalid()) // if conversion failed, don't report another error
1344       return;
1345   }
1346 
1347   unsigned msg = diag::err_bad_cxx_cast_generic;
1348   TryCastResult tcr =
1349       TryStaticCast(Self, SrcExpr, DestType, CheckedConversionKind::OtherCast,
1350                     OpRange, msg, Kind, BasePath, /*ListInitialization=*/false);
1351   if (tcr != TC_Success && msg != 0) {
1352     if (SrcExpr.isInvalid())
1353       return;
1354     if (SrcExpr.get()->getType() == Self.Context.OverloadTy) {
1355       OverloadExpr* oe = OverloadExpr::find(SrcExpr.get()).Expression;
1356       Self.Diag(OpRange.getBegin(), diag::err_bad_static_cast_overload)
1357         << oe->getName() << DestType << OpRange
1358         << oe->getQualifierLoc().getSourceRange();
1359       Self.NoteAllOverloadCandidates(SrcExpr.get());
1360     } else {
1361       diagnoseBadCast(Self, msg, CT_Static, OpRange, SrcExpr.get(), DestType,
1362                       /*listInitialization=*/false);
1363     }
1364   }
1365 
1366   if (isValidCast(tcr)) {
1367     if (Kind == CK_BitCast)
1368       checkCastAlign();
1369     if (Self.getLangOpts().allowsNonTrivialObjCLifetimeQualifiers())
1370       checkObjCConversion(CheckedConversionKind::OtherCast);
1371   } else {
1372     SrcExpr = ExprError();
1373   }
1374 }
1375 
IsAddressSpaceConversion(QualType SrcType,QualType DestType)1376 static bool IsAddressSpaceConversion(QualType SrcType, QualType DestType) {
1377   auto *SrcPtrType = SrcType->getAs<PointerType>();
1378   if (!SrcPtrType)
1379     return false;
1380   auto *DestPtrType = DestType->getAs<PointerType>();
1381   if (!DestPtrType)
1382     return false;
1383   return SrcPtrType->getPointeeType().getAddressSpace() !=
1384          DestPtrType->getPointeeType().getAddressSpace();
1385 }
1386 
1387 /// TryStaticCast - Check if a static cast can be performed, and do so if
1388 /// possible. If @p CStyle, ignore access restrictions on hierarchy casting
1389 /// and casting away constness.
TryStaticCast(Sema & Self,ExprResult & SrcExpr,QualType DestType,CheckedConversionKind CCK,CastOperation::OpRangeType OpRange,unsigned & msg,CastKind & Kind,CXXCastPath & BasePath,bool ListInitialization)1390 static TryCastResult TryStaticCast(Sema &Self, ExprResult &SrcExpr,
1391                                    QualType DestType, CheckedConversionKind CCK,
1392                                    CastOperation::OpRangeType OpRange,
1393                                    unsigned &msg, CastKind &Kind,
1394                                    CXXCastPath &BasePath,
1395                                    bool ListInitialization) {
1396   // Determine whether we have the semantics of a C-style cast.
1397   bool CStyle = (CCK == CheckedConversionKind::CStyleCast ||
1398                  CCK == CheckedConversionKind::FunctionalCast);
1399 
1400   // The order the tests is not entirely arbitrary. There is one conversion
1401   // that can be handled in two different ways. Given:
1402   // struct A {};
1403   // struct B : public A {
1404   //   B(); B(const A&);
1405   // };
1406   // const A &a = B();
1407   // the cast static_cast<const B&>(a) could be seen as either a static
1408   // reference downcast, or an explicit invocation of the user-defined
1409   // conversion using B's conversion constructor.
1410   // DR 427 specifies that the downcast is to be applied here.
1411 
1412   // C++ 5.2.9p4: Any expression can be explicitly converted to type "cv void".
1413   // Done outside this function.
1414 
1415   TryCastResult tcr;
1416 
1417   // C++ 5.2.9p5, reference downcast.
1418   // See the function for details.
1419   // DR 427 specifies that this is to be applied before paragraph 2.
1420   tcr = TryStaticReferenceDowncast(Self, SrcExpr.get(), DestType, CStyle,
1421                                    OpRange, msg, Kind, BasePath);
1422   if (tcr != TC_NotApplicable)
1423     return tcr;
1424 
1425   // C++11 [expr.static.cast]p3:
1426   //   A glvalue of type "cv1 T1" can be cast to type "rvalue reference to cv2
1427   //   T2" if "cv2 T2" is reference-compatible with "cv1 T1".
1428   tcr = TryLValueToRValueCast(Self, SrcExpr.get(), DestType, CStyle, OpRange,
1429                               Kind, BasePath, msg);
1430   if (tcr != TC_NotApplicable)
1431     return tcr;
1432 
1433   // C++ 5.2.9p2: An expression e can be explicitly converted to a type T
1434   //   [...] if the declaration "T t(e);" is well-formed, [...].
1435   tcr = TryStaticImplicitCast(Self, SrcExpr, DestType, CCK, OpRange, msg,
1436                               Kind, ListInitialization);
1437   if (SrcExpr.isInvalid())
1438     return TC_Failed;
1439   if (tcr != TC_NotApplicable)
1440     return tcr;
1441 
1442   // C++ 5.2.9p6: May apply the reverse of any standard conversion, except
1443   // lvalue-to-rvalue, array-to-pointer, function-to-pointer, and boolean
1444   // conversions, subject to further restrictions.
1445   // Also, C++ 5.2.9p1 forbids casting away constness, which makes reversal
1446   // of qualification conversions impossible. (In C++20, adding an array bound
1447   // would be the reverse of a qualification conversion, but adding permission
1448   // to add an array bound in a static_cast is a wording oversight.)
1449   // In the CStyle case, the earlier attempt to const_cast should have taken
1450   // care of reverse qualification conversions.
1451 
1452   QualType SrcType = Self.Context.getCanonicalType(SrcExpr.get()->getType());
1453 
1454   // C++0x 5.2.9p9: A value of a scoped enumeration type can be explicitly
1455   // converted to an integral type. [...] A value of a scoped enumeration type
1456   // can also be explicitly converted to a floating-point type [...].
1457   if (const EnumType *Enum = SrcType->getAs<EnumType>()) {
1458     if (Enum->getDecl()->isScoped()) {
1459       if (DestType->isBooleanType()) {
1460         Kind = CK_IntegralToBoolean;
1461         return TC_Success;
1462       } else if (DestType->isIntegralType(Self.Context)) {
1463         Kind = CK_IntegralCast;
1464         return TC_Success;
1465       } else if (DestType->isRealFloatingType()) {
1466         Kind = CK_IntegralToFloating;
1467         return TC_Success;
1468       }
1469     }
1470   }
1471 
1472   // Reverse integral promotion/conversion. All such conversions are themselves
1473   // again integral promotions or conversions and are thus already handled by
1474   // p2 (TryDirectInitialization above).
1475   // (Note: any data loss warnings should be suppressed.)
1476   // The exception is the reverse of enum->integer, i.e. integer->enum (and
1477   // enum->enum). See also C++ 5.2.9p7.
1478   // The same goes for reverse floating point promotion/conversion and
1479   // floating-integral conversions. Again, only floating->enum is relevant.
1480   if (DestType->isEnumeralType()) {
1481     if (Self.RequireCompleteType(OpRange.getBegin(), DestType,
1482                                  diag::err_bad_cast_incomplete)) {
1483       SrcExpr = ExprError();
1484       return TC_Failed;
1485     }
1486     if (SrcType->isIntegralOrEnumerationType()) {
1487       // [expr.static.cast]p10 If the enumeration type has a fixed underlying
1488       // type, the value is first converted to that type by integral conversion
1489       const EnumType *Enum = DestType->castAs<EnumType>();
1490       Kind = Enum->getDecl()->isFixed() &&
1491                      Enum->getDecl()->getIntegerType()->isBooleanType()
1492                  ? CK_IntegralToBoolean
1493                  : CK_IntegralCast;
1494       return TC_Success;
1495     } else if (SrcType->isRealFloatingType())   {
1496       Kind = CK_FloatingToIntegral;
1497       return TC_Success;
1498     }
1499   }
1500 
1501   // Reverse pointer upcast. C++ 4.10p3 specifies pointer upcast.
1502   // C++ 5.2.9p8 additionally disallows a cast path through virtual inheritance.
1503   tcr = TryStaticPointerDowncast(Self, SrcType, DestType, CStyle, OpRange, msg,
1504                                  Kind, BasePath);
1505   if (tcr != TC_NotApplicable)
1506     return tcr;
1507 
1508   // Reverse member pointer conversion. C++ 4.11 specifies member pointer
1509   // conversion. C++ 5.2.9p9 has additional information.
1510   // DR54's access restrictions apply here also.
1511   tcr = TryStaticMemberPointerUpcast(Self, SrcExpr, SrcType, DestType, CStyle,
1512                                      OpRange, msg, Kind, BasePath);
1513   if (tcr != TC_NotApplicable)
1514     return tcr;
1515 
1516   // Reverse pointer conversion to void*. C++ 4.10.p2 specifies conversion to
1517   // void*. C++ 5.2.9p10 specifies additional restrictions, which really is
1518   // just the usual constness stuff.
1519   if (const PointerType *SrcPointer = SrcType->getAs<PointerType>()) {
1520     QualType SrcPointee = SrcPointer->getPointeeType();
1521     if (SrcPointee->isVoidType()) {
1522       if (const PointerType *DestPointer = DestType->getAs<PointerType>()) {
1523         QualType DestPointee = DestPointer->getPointeeType();
1524         if (DestPointee->isIncompleteOrObjectType()) {
1525           // This is definitely the intended conversion, but it might fail due
1526           // to a qualifier violation. Note that we permit Objective-C lifetime
1527           // and GC qualifier mismatches here.
1528           if (!CStyle) {
1529             Qualifiers DestPointeeQuals = DestPointee.getQualifiers();
1530             Qualifiers SrcPointeeQuals = SrcPointee.getQualifiers();
1531             DestPointeeQuals.removeObjCGCAttr();
1532             DestPointeeQuals.removeObjCLifetime();
1533             SrcPointeeQuals.removeObjCGCAttr();
1534             SrcPointeeQuals.removeObjCLifetime();
1535             if (DestPointeeQuals != SrcPointeeQuals &&
1536                 !DestPointeeQuals.compatiblyIncludes(SrcPointeeQuals,
1537                                                      Self.getASTContext())) {
1538               msg = diag::err_bad_cxx_cast_qualifiers_away;
1539               return TC_Failed;
1540             }
1541           }
1542           Kind = IsAddressSpaceConversion(SrcType, DestType)
1543                      ? CK_AddressSpaceConversion
1544                      : CK_BitCast;
1545           return TC_Success;
1546         }
1547 
1548         // Microsoft permits static_cast from 'pointer-to-void' to
1549         // 'pointer-to-function'.
1550         if (!CStyle && Self.getLangOpts().MSVCCompat &&
1551             DestPointee->isFunctionType()) {
1552           Self.Diag(OpRange.getBegin(), diag::ext_ms_cast_fn_obj) << OpRange;
1553           Kind = CK_BitCast;
1554           return TC_Success;
1555         }
1556       }
1557       else if (DestType->isObjCObjectPointerType()) {
1558         // allow both c-style cast and static_cast of objective-c pointers as
1559         // they are pervasive.
1560         Kind = CK_CPointerToObjCPointerCast;
1561         return TC_Success;
1562       }
1563       else if (CStyle && DestType->isBlockPointerType()) {
1564         // allow c-style cast of void * to block pointers.
1565         Kind = CK_AnyPointerToBlockPointerCast;
1566         return TC_Success;
1567       }
1568     }
1569   }
1570   // Allow arbitrary objective-c pointer conversion with static casts.
1571   if (SrcType->isObjCObjectPointerType() &&
1572       DestType->isObjCObjectPointerType()) {
1573     Kind = CK_BitCast;
1574     return TC_Success;
1575   }
1576   // Allow ns-pointer to cf-pointer conversion in either direction
1577   // with static casts.
1578   if (!CStyle &&
1579       Self.ObjC().CheckTollFreeBridgeStaticCast(DestType, SrcExpr.get(), Kind))
1580     return TC_Success;
1581 
1582   // See if it looks like the user is trying to convert between
1583   // related record types, and select a better diagnostic if so.
1584   if (auto SrcPointer = SrcType->getAs<PointerType>())
1585     if (auto DestPointer = DestType->getAs<PointerType>())
1586       if (SrcPointer->getPointeeType()->getAs<RecordType>() &&
1587           DestPointer->getPointeeType()->getAs<RecordType>())
1588        msg = diag::err_bad_cxx_cast_unrelated_class;
1589 
1590   if (SrcType->isMatrixType() && DestType->isMatrixType()) {
1591     if (Self.CheckMatrixCast(OpRange, DestType, SrcType, Kind)) {
1592       SrcExpr = ExprError();
1593       return TC_Failed;
1594     }
1595     return TC_Success;
1596   }
1597 
1598   // We tried everything. Everything! Nothing works! :-(
1599   return TC_NotApplicable;
1600 }
1601 
1602 /// Tests whether a conversion according to N2844 is valid.
TryLValueToRValueCast(Sema & Self,Expr * SrcExpr,QualType DestType,bool CStyle,SourceRange OpRange,CastKind & Kind,CXXCastPath & BasePath,unsigned & msg)1603 TryCastResult TryLValueToRValueCast(Sema &Self, Expr *SrcExpr,
1604                                     QualType DestType, bool CStyle,
1605                                     SourceRange OpRange, CastKind &Kind,
1606                                     CXXCastPath &BasePath, unsigned &msg) {
1607   // C++11 [expr.static.cast]p3:
1608   //   A glvalue of type "cv1 T1" can be cast to type "rvalue reference to
1609   //   cv2 T2" if "cv2 T2" is reference-compatible with "cv1 T1".
1610   const RValueReferenceType *R = DestType->getAs<RValueReferenceType>();
1611   if (!R)
1612     return TC_NotApplicable;
1613 
1614   if (!SrcExpr->isGLValue())
1615     return TC_NotApplicable;
1616 
1617   // Because we try the reference downcast before this function, from now on
1618   // this is the only cast possibility, so we issue an error if we fail now.
1619   QualType FromType = SrcExpr->getType();
1620   QualType ToType = R->getPointeeType();
1621   if (CStyle) {
1622     FromType = FromType.getUnqualifiedType();
1623     ToType = ToType.getUnqualifiedType();
1624   }
1625 
1626   Sema::ReferenceConversions RefConv;
1627   Sema::ReferenceCompareResult RefResult = Self.CompareReferenceRelationship(
1628       SrcExpr->getBeginLoc(), ToType, FromType, &RefConv);
1629   if (RefResult != Sema::Ref_Compatible) {
1630     if (CStyle || RefResult == Sema::Ref_Incompatible)
1631       return TC_NotApplicable;
1632     // Diagnose types which are reference-related but not compatible here since
1633     // we can provide better diagnostics. In these cases forwarding to
1634     // [expr.static.cast]p4 should never result in a well-formed cast.
1635     msg = SrcExpr->isLValue() ? diag::err_bad_lvalue_to_rvalue_cast
1636                               : diag::err_bad_rvalue_to_rvalue_cast;
1637     return TC_Failed;
1638   }
1639 
1640   if (RefConv & Sema::ReferenceConversions::DerivedToBase) {
1641     Kind = CK_DerivedToBase;
1642     if (Self.CheckDerivedToBaseConversion(FromType, ToType,
1643                                           SrcExpr->getBeginLoc(), OpRange,
1644                                           &BasePath, CStyle)) {
1645       msg = 0;
1646       return TC_Failed;
1647     }
1648   } else
1649     Kind = CK_NoOp;
1650 
1651   return TC_Success;
1652 }
1653 
1654 /// Tests whether a conversion according to C++ 5.2.9p5 is valid.
TryStaticReferenceDowncast(Sema & Self,Expr * SrcExpr,QualType DestType,bool CStyle,CastOperation::OpRangeType OpRange,unsigned & msg,CastKind & Kind,CXXCastPath & BasePath)1655 TryCastResult TryStaticReferenceDowncast(Sema &Self, Expr *SrcExpr,
1656                                          QualType DestType, bool CStyle,
1657                                          CastOperation::OpRangeType OpRange,
1658                                          unsigned &msg, CastKind &Kind,
1659                                          CXXCastPath &BasePath) {
1660   // C++ 5.2.9p5: An lvalue of type "cv1 B", where B is a class type, can be
1661   //   cast to type "reference to cv2 D", where D is a class derived from B,
1662   //   if a valid standard conversion from "pointer to D" to "pointer to B"
1663   //   exists, cv2 >= cv1, and B is not a virtual base class of D.
1664   // In addition, DR54 clarifies that the base must be accessible in the
1665   // current context. Although the wording of DR54 only applies to the pointer
1666   // variant of this rule, the intent is clearly for it to apply to the this
1667   // conversion as well.
1668 
1669   const ReferenceType *DestReference = DestType->getAs<ReferenceType>();
1670   if (!DestReference) {
1671     return TC_NotApplicable;
1672   }
1673   bool RValueRef = DestReference->isRValueReferenceType();
1674   if (!RValueRef && !SrcExpr->isLValue()) {
1675     // We know the left side is an lvalue reference, so we can suggest a reason.
1676     msg = diag::err_bad_cxx_cast_rvalue;
1677     return TC_NotApplicable;
1678   }
1679 
1680   QualType DestPointee = DestReference->getPointeeType();
1681 
1682   // FIXME: If the source is a prvalue, we should issue a warning (because the
1683   // cast always has undefined behavior), and for AST consistency, we should
1684   // materialize a temporary.
1685   return TryStaticDowncast(Self,
1686                            Self.Context.getCanonicalType(SrcExpr->getType()),
1687                            Self.Context.getCanonicalType(DestPointee), CStyle,
1688                            OpRange, SrcExpr->getType(), DestType, msg, Kind,
1689                            BasePath);
1690 }
1691 
1692 /// Tests whether a conversion according to C++ 5.2.9p8 is valid.
TryStaticPointerDowncast(Sema & Self,QualType SrcType,QualType DestType,bool CStyle,CastOperation::OpRangeType OpRange,unsigned & msg,CastKind & Kind,CXXCastPath & BasePath)1693 TryCastResult TryStaticPointerDowncast(Sema &Self, QualType SrcType,
1694                                        QualType DestType, bool CStyle,
1695                                        CastOperation::OpRangeType OpRange,
1696                                        unsigned &msg, CastKind &Kind,
1697                                        CXXCastPath &BasePath) {
1698   // C++ 5.2.9p8: An rvalue of type "pointer to cv1 B", where B is a class
1699   //   type, can be converted to an rvalue of type "pointer to cv2 D", where D
1700   //   is a class derived from B, if a valid standard conversion from "pointer
1701   //   to D" to "pointer to B" exists, cv2 >= cv1, and B is not a virtual base
1702   //   class of D.
1703   // In addition, DR54 clarifies that the base must be accessible in the
1704   // current context.
1705 
1706   const PointerType *DestPointer = DestType->getAs<PointerType>();
1707   if (!DestPointer) {
1708     return TC_NotApplicable;
1709   }
1710 
1711   const PointerType *SrcPointer = SrcType->getAs<PointerType>();
1712   if (!SrcPointer) {
1713     msg = diag::err_bad_static_cast_pointer_nonpointer;
1714     return TC_NotApplicable;
1715   }
1716 
1717   return TryStaticDowncast(Self,
1718                    Self.Context.getCanonicalType(SrcPointer->getPointeeType()),
1719                   Self.Context.getCanonicalType(DestPointer->getPointeeType()),
1720                            CStyle, OpRange, SrcType, DestType, msg, Kind,
1721                            BasePath);
1722 }
1723 
1724 /// TryStaticDowncast - Common functionality of TryStaticReferenceDowncast and
1725 /// TryStaticPointerDowncast. Tests whether a static downcast from SrcType to
1726 /// DestType is possible and allowed.
TryStaticDowncast(Sema & Self,CanQualType SrcType,CanQualType DestType,bool CStyle,CastOperation::OpRangeType OpRange,QualType OrigSrcType,QualType OrigDestType,unsigned & msg,CastKind & Kind,CXXCastPath & BasePath)1727 TryCastResult TryStaticDowncast(Sema &Self, CanQualType SrcType,
1728                                 CanQualType DestType, bool CStyle,
1729                                 CastOperation::OpRangeType OpRange,
1730                                 QualType OrigSrcType, QualType OrigDestType,
1731                                 unsigned &msg, CastKind &Kind,
1732                                 CXXCastPath &BasePath) {
1733   // We can only work with complete types. But don't complain if it doesn't work
1734   if (!Self.isCompleteType(OpRange.getBegin(), SrcType) ||
1735       !Self.isCompleteType(OpRange.getBegin(), DestType))
1736     return TC_NotApplicable;
1737 
1738   // Downcast can only happen in class hierarchies, so we need classes.
1739   if (!DestType->getAs<RecordType>() || !SrcType->getAs<RecordType>()) {
1740     return TC_NotApplicable;
1741   }
1742 
1743   CXXBasePaths Paths(/*FindAmbiguities=*/true, /*RecordPaths=*/true,
1744                      /*DetectVirtual=*/true);
1745   if (!Self.IsDerivedFrom(OpRange.getBegin(), DestType, SrcType, Paths)) {
1746     return TC_NotApplicable;
1747   }
1748 
1749   // Target type does derive from source type. Now we're serious. If an error
1750   // appears now, it's not ignored.
1751   // This may not be entirely in line with the standard. Take for example:
1752   // struct A {};
1753   // struct B : virtual A {
1754   //   B(A&);
1755   // };
1756   //
1757   // void f()
1758   // {
1759   //   (void)static_cast<const B&>(*((A*)0));
1760   // }
1761   // As far as the standard is concerned, p5 does not apply (A is virtual), so
1762   // p2 should be used instead - "const B& t(*((A*)0));" is perfectly valid.
1763   // However, both GCC and Comeau reject this example, and accepting it would
1764   // mean more complex code if we're to preserve the nice error message.
1765   // FIXME: Being 100% compliant here would be nice to have.
1766 
1767   // Must preserve cv, as always, unless we're in C-style mode.
1768   if (!CStyle &&
1769       !DestType.isAtLeastAsQualifiedAs(SrcType, Self.getASTContext())) {
1770     msg = diag::err_bad_cxx_cast_qualifiers_away;
1771     return TC_Failed;
1772   }
1773 
1774   if (Paths.isAmbiguous(SrcType.getUnqualifiedType())) {
1775     // This code is analoguous to that in CheckDerivedToBaseConversion, except
1776     // that it builds the paths in reverse order.
1777     // To sum up: record all paths to the base and build a nice string from
1778     // them. Use it to spice up the error message.
1779     if (!Paths.isRecordingPaths()) {
1780       Paths.clear();
1781       Paths.setRecordingPaths(true);
1782       Self.IsDerivedFrom(OpRange.getBegin(), DestType, SrcType, Paths);
1783     }
1784     std::string PathDisplayStr;
1785     std::set<unsigned> DisplayedPaths;
1786     for (clang::CXXBasePath &Path : Paths) {
1787       if (DisplayedPaths.insert(Path.back().SubobjectNumber).second) {
1788         // We haven't displayed a path to this particular base
1789         // class subobject yet.
1790         PathDisplayStr += "\n    ";
1791         for (CXXBasePathElement &PE : llvm::reverse(Path))
1792           PathDisplayStr += PE.Base->getType().getAsString() + " -> ";
1793         PathDisplayStr += QualType(DestType).getAsString();
1794       }
1795     }
1796 
1797     Self.Diag(OpRange.getBegin(), diag::err_ambiguous_base_to_derived_cast)
1798       << QualType(SrcType).getUnqualifiedType()
1799       << QualType(DestType).getUnqualifiedType()
1800       << PathDisplayStr << OpRange;
1801     msg = 0;
1802     return TC_Failed;
1803   }
1804 
1805   if (Paths.getDetectedVirtual() != nullptr) {
1806     QualType VirtualBase(Paths.getDetectedVirtual(), 0);
1807     Self.Diag(OpRange.getBegin(), diag::err_static_downcast_via_virtual)
1808       << OrigSrcType << OrigDestType << VirtualBase << OpRange;
1809     msg = 0;
1810     return TC_Failed;
1811   }
1812 
1813   if (!CStyle) {
1814     switch (Self.CheckBaseClassAccess(OpRange.getBegin(),
1815                                       SrcType, DestType,
1816                                       Paths.front(),
1817                                 diag::err_downcast_from_inaccessible_base)) {
1818     case Sema::AR_accessible:
1819     case Sema::AR_delayed:     // be optimistic
1820     case Sema::AR_dependent:   // be optimistic
1821       break;
1822 
1823     case Sema::AR_inaccessible:
1824       msg = 0;
1825       return TC_Failed;
1826     }
1827   }
1828 
1829   Self.BuildBasePathArray(Paths, BasePath);
1830   Kind = CK_BaseToDerived;
1831   return TC_Success;
1832 }
1833 
1834 /// TryStaticMemberPointerUpcast - Tests whether a conversion according to
1835 /// C++ 5.2.9p9 is valid:
1836 ///
1837 ///   An rvalue of type "pointer to member of D of type cv1 T" can be
1838 ///   converted to an rvalue of type "pointer to member of B of type cv2 T",
1839 ///   where B is a base class of D [...].
1840 ///
TryStaticMemberPointerUpcast(Sema & Self,ExprResult & SrcExpr,QualType SrcType,QualType DestType,bool CStyle,CastOperation::OpRangeType OpRange,unsigned & msg,CastKind & Kind,CXXCastPath & BasePath)1841 TryCastResult TryStaticMemberPointerUpcast(Sema &Self, ExprResult &SrcExpr,
1842                                            QualType SrcType, QualType DestType,
1843                                            bool CStyle,
1844                                            CastOperation::OpRangeType OpRange,
1845                                            unsigned &msg, CastKind &Kind,
1846                                            CXXCastPath &BasePath) {
1847   const MemberPointerType *DestMemPtr = DestType->getAs<MemberPointerType>();
1848   if (!DestMemPtr)
1849     return TC_NotApplicable;
1850 
1851   bool WasOverloadedFunction = false;
1852   DeclAccessPair FoundOverload;
1853   if (SrcExpr.get()->getType() == Self.Context.OverloadTy) {
1854     if (FunctionDecl *Fn
1855           = Self.ResolveAddressOfOverloadedFunction(SrcExpr.get(), DestType, false,
1856                                                     FoundOverload)) {
1857       CXXMethodDecl *M = cast<CXXMethodDecl>(Fn);
1858       SrcType = Self.Context.getMemberPointerType(
1859           Fn->getType(), /*Qualifier=*/nullptr, M->getParent());
1860       WasOverloadedFunction = true;
1861     }
1862   }
1863 
1864   switch (Self.CheckMemberPointerConversion(
1865       SrcType, DestMemPtr, Kind, BasePath, OpRange.getBegin(), OpRange, CStyle,
1866       Sema::MemberPointerConversionDirection::Upcast)) {
1867   case Sema::MemberPointerConversionResult::Success:
1868     if (Kind == CK_NullToMemberPointer) {
1869       msg = diag::err_bad_static_cast_member_pointer_nonmp;
1870       return TC_NotApplicable;
1871     }
1872     break;
1873   case Sema::MemberPointerConversionResult::DifferentPointee:
1874   case Sema::MemberPointerConversionResult::NotDerived:
1875     return TC_NotApplicable;
1876   case Sema::MemberPointerConversionResult::Ambiguous:
1877   case Sema::MemberPointerConversionResult::Virtual:
1878   case Sema::MemberPointerConversionResult::Inaccessible:
1879     msg = 0;
1880     return TC_Failed;
1881   }
1882 
1883   if (WasOverloadedFunction) {
1884     // Resolve the address of the overloaded function again, this time
1885     // allowing complaints if something goes wrong.
1886     FunctionDecl *Fn = Self.ResolveAddressOfOverloadedFunction(SrcExpr.get(),
1887                                                                DestType,
1888                                                                true,
1889                                                                FoundOverload);
1890     if (!Fn) {
1891       msg = 0;
1892       return TC_Failed;
1893     }
1894 
1895     SrcExpr = Self.FixOverloadedFunctionReference(SrcExpr, FoundOverload, Fn);
1896     if (!SrcExpr.isUsable()) {
1897       msg = 0;
1898       return TC_Failed;
1899     }
1900   }
1901   return TC_Success;
1902 }
1903 
1904 /// TryStaticImplicitCast - Tests whether a conversion according to C++ 5.2.9p2
1905 /// is valid:
1906 ///
1907 ///   An expression e can be explicitly converted to a type T using a
1908 ///   @c static_cast if the declaration "T t(e);" is well-formed [...].
TryStaticImplicitCast(Sema & Self,ExprResult & SrcExpr,QualType DestType,CheckedConversionKind CCK,CastOperation::OpRangeType OpRange,unsigned & msg,CastKind & Kind,bool ListInitialization)1909 TryCastResult TryStaticImplicitCast(Sema &Self, ExprResult &SrcExpr,
1910                                     QualType DestType,
1911                                     CheckedConversionKind CCK,
1912                                     CastOperation::OpRangeType OpRange,
1913                                     unsigned &msg, CastKind &Kind,
1914                                     bool ListInitialization) {
1915   if (DestType->isRecordType()) {
1916     if (Self.RequireCompleteType(OpRange.getBegin(), DestType,
1917                                  diag::err_bad_cast_incomplete) ||
1918         Self.RequireNonAbstractType(OpRange.getBegin(), DestType,
1919                                     diag::err_allocation_of_abstract_type)) {
1920       msg = 0;
1921       return TC_Failed;
1922     }
1923   }
1924 
1925   InitializedEntity Entity = InitializedEntity::InitializeTemporary(DestType);
1926   InitializationKind InitKind =
1927       (CCK == CheckedConversionKind::CStyleCast)
1928           ? InitializationKind::CreateCStyleCast(OpRange.getBegin(), OpRange,
1929                                                  ListInitialization)
1930       : (CCK == CheckedConversionKind::FunctionalCast)
1931           ? InitializationKind::CreateFunctionalCast(
1932                 OpRange.getBegin(), OpRange.getParenRange(), ListInitialization)
1933           : InitializationKind::CreateCast(OpRange);
1934   Expr *SrcExprRaw = SrcExpr.get();
1935   // FIXME: Per DR242, we should check for an implicit conversion sequence
1936   // or for a constructor that could be invoked by direct-initialization
1937   // here, not for an initialization sequence.
1938   InitializationSequence InitSeq(Self, Entity, InitKind, SrcExprRaw);
1939 
1940   // At this point of CheckStaticCast, if the destination is a reference,
1941   // or the expression is an overload expression this has to work.
1942   // There is no other way that works.
1943   // On the other hand, if we're checking a C-style cast, we've still got
1944   // the reinterpret_cast way.
1945   bool CStyle = (CCK == CheckedConversionKind::CStyleCast ||
1946                  CCK == CheckedConversionKind::FunctionalCast);
1947   if (InitSeq.Failed() && (CStyle || !DestType->isReferenceType()))
1948     return TC_NotApplicable;
1949 
1950   ExprResult Result = InitSeq.Perform(Self, Entity, InitKind, SrcExprRaw);
1951   if (Result.isInvalid()) {
1952     msg = 0;
1953     return TC_Failed;
1954   }
1955 
1956   if (InitSeq.isConstructorInitialization())
1957     Kind = CK_ConstructorConversion;
1958   else
1959     Kind = CK_NoOp;
1960 
1961   SrcExpr = Result;
1962   return TC_Success;
1963 }
1964 
1965 /// TryConstCast - See if a const_cast from source to destination is allowed,
1966 /// and perform it if it is.
TryConstCast(Sema & Self,ExprResult & SrcExpr,QualType DestType,bool CStyle,unsigned & msg)1967 static TryCastResult TryConstCast(Sema &Self, ExprResult &SrcExpr,
1968                                   QualType DestType, bool CStyle,
1969                                   unsigned &msg) {
1970   DestType = Self.Context.getCanonicalType(DestType);
1971   QualType SrcType = SrcExpr.get()->getType();
1972   bool NeedToMaterializeTemporary = false;
1973 
1974   if (const ReferenceType *DestTypeTmp =DestType->getAs<ReferenceType>()) {
1975     // C++11 5.2.11p4:
1976     //   if a pointer to T1 can be explicitly converted to the type "pointer to
1977     //   T2" using a const_cast, then the following conversions can also be
1978     //   made:
1979     //    -- an lvalue of type T1 can be explicitly converted to an lvalue of
1980     //       type T2 using the cast const_cast<T2&>;
1981     //    -- a glvalue of type T1 can be explicitly converted to an xvalue of
1982     //       type T2 using the cast const_cast<T2&&>; and
1983     //    -- if T1 is a class type, a prvalue of type T1 can be explicitly
1984     //       converted to an xvalue of type T2 using the cast const_cast<T2&&>.
1985 
1986     if (isa<LValueReferenceType>(DestTypeTmp) && !SrcExpr.get()->isLValue()) {
1987       // Cannot const_cast non-lvalue to lvalue reference type. But if this
1988       // is C-style, static_cast might find a way, so we simply suggest a
1989       // message and tell the parent to keep searching.
1990       msg = diag::err_bad_cxx_cast_rvalue;
1991       return TC_NotApplicable;
1992     }
1993 
1994     if (isa<RValueReferenceType>(DestTypeTmp) && SrcExpr.get()->isPRValue()) {
1995       if (!SrcType->isRecordType()) {
1996         // Cannot const_cast non-class prvalue to rvalue reference type. But if
1997         // this is C-style, static_cast can do this.
1998         msg = diag::err_bad_cxx_cast_rvalue;
1999         return TC_NotApplicable;
2000       }
2001 
2002       // Materialize the class prvalue so that the const_cast can bind a
2003       // reference to it.
2004       NeedToMaterializeTemporary = true;
2005     }
2006 
2007     // It's not completely clear under the standard whether we can
2008     // const_cast bit-field gl-values.  Doing so would not be
2009     // intrinsically complicated, but for now, we say no for
2010     // consistency with other compilers and await the word of the
2011     // committee.
2012     if (SrcExpr.get()->refersToBitField()) {
2013       msg = diag::err_bad_cxx_cast_bitfield;
2014       return TC_NotApplicable;
2015     }
2016 
2017     DestType = Self.Context.getPointerType(DestTypeTmp->getPointeeType());
2018     SrcType = Self.Context.getPointerType(SrcType);
2019   }
2020 
2021   // C++ 5.2.11p5: For a const_cast involving pointers to data members [...]
2022   //   the rules for const_cast are the same as those used for pointers.
2023 
2024   if (!DestType->isPointerType() &&
2025       !DestType->isMemberPointerType() &&
2026       !DestType->isObjCObjectPointerType()) {
2027     // Cannot cast to non-pointer, non-reference type. Note that, if DestType
2028     // was a reference type, we converted it to a pointer above.
2029     // The status of rvalue references isn't entirely clear, but it looks like
2030     // conversion to them is simply invalid.
2031     // C++ 5.2.11p3: For two pointer types [...]
2032     if (!CStyle)
2033       msg = diag::err_bad_const_cast_dest;
2034     return TC_NotApplicable;
2035   }
2036   if (DestType->isFunctionPointerType() ||
2037       DestType->isMemberFunctionPointerType()) {
2038     // Cannot cast direct function pointers.
2039     // C++ 5.2.11p2: [...] where T is any object type or the void type [...]
2040     // T is the ultimate pointee of source and target type.
2041     if (!CStyle)
2042       msg = diag::err_bad_const_cast_dest;
2043     return TC_NotApplicable;
2044   }
2045 
2046   // C++ [expr.const.cast]p3:
2047   //   "For two similar types T1 and T2, [...]"
2048   //
2049   // We only allow a const_cast to change cvr-qualifiers, not other kinds of
2050   // type qualifiers. (Likewise, we ignore other changes when determining
2051   // whether a cast casts away constness.)
2052   if (!Self.Context.hasCvrSimilarType(SrcType, DestType))
2053     return TC_NotApplicable;
2054 
2055   if (NeedToMaterializeTemporary)
2056     // This is a const_cast from a class prvalue to an rvalue reference type.
2057     // Materialize a temporary to store the result of the conversion.
2058     SrcExpr = Self.CreateMaterializeTemporaryExpr(SrcExpr.get()->getType(),
2059                                                   SrcExpr.get(),
2060                                                   /*IsLValueReference*/ false);
2061 
2062   return TC_Success;
2063 }
2064 
2065 // Checks for undefined behavior in reinterpret_cast.
2066 // The cases that is checked for is:
2067 // *reinterpret_cast<T*>(&a)
2068 // reinterpret_cast<T&>(a)
2069 // where accessing 'a' as type 'T' will result in undefined behavior.
CheckCompatibleReinterpretCast(QualType SrcType,QualType DestType,bool IsDereference,SourceRange Range)2070 void Sema::CheckCompatibleReinterpretCast(QualType SrcType, QualType DestType,
2071                                           bool IsDereference,
2072                                           SourceRange Range) {
2073   unsigned DiagID = IsDereference ?
2074                         diag::warn_pointer_indirection_from_incompatible_type :
2075                         diag::warn_undefined_reinterpret_cast;
2076 
2077   if (Diags.isIgnored(DiagID, Range.getBegin()))
2078     return;
2079 
2080   QualType SrcTy, DestTy;
2081   if (IsDereference) {
2082     if (!SrcType->getAs<PointerType>() || !DestType->getAs<PointerType>()) {
2083       return;
2084     }
2085     SrcTy = SrcType->getPointeeType();
2086     DestTy = DestType->getPointeeType();
2087   } else {
2088     if (!DestType->getAs<ReferenceType>()) {
2089       return;
2090     }
2091     SrcTy = SrcType;
2092     DestTy = DestType->getPointeeType();
2093   }
2094 
2095   // Cast is compatible if the types are the same.
2096   if (Context.hasSameUnqualifiedType(DestTy, SrcTy)) {
2097     return;
2098   }
2099   // or one of the types is a char or void type
2100   if (DestTy->isAnyCharacterType() || DestTy->isVoidType() ||
2101       SrcTy->isAnyCharacterType() || SrcTy->isVoidType()) {
2102     return;
2103   }
2104   // or one of the types is a tag type.
2105   if (SrcTy->getAs<TagType>() || DestTy->getAs<TagType>()) {
2106     return;
2107   }
2108 
2109   // FIXME: Scoped enums?
2110   if ((SrcTy->isUnsignedIntegerType() && DestTy->isSignedIntegerType()) ||
2111       (SrcTy->isSignedIntegerType() && DestTy->isUnsignedIntegerType())) {
2112     if (Context.getTypeSize(DestTy) == Context.getTypeSize(SrcTy)) {
2113       return;
2114     }
2115   }
2116 
2117   if (SrcTy->isDependentType() || DestTy->isDependentType()) {
2118     return;
2119   }
2120 
2121   Diag(Range.getBegin(), DiagID) << SrcType << DestType << Range;
2122 }
2123 
DiagnoseCastOfObjCSEL(Sema & Self,const ExprResult & SrcExpr,QualType DestType)2124 static void DiagnoseCastOfObjCSEL(Sema &Self, const ExprResult &SrcExpr,
2125                                   QualType DestType) {
2126   QualType SrcType = SrcExpr.get()->getType();
2127   if (Self.Context.hasSameType(SrcType, DestType))
2128     return;
2129   if (const PointerType *SrcPtrTy = SrcType->getAs<PointerType>())
2130     if (SrcPtrTy->isObjCSelType()) {
2131       QualType DT = DestType;
2132       if (isa<PointerType>(DestType))
2133         DT = DestType->getPointeeType();
2134       if (!DT.getUnqualifiedType()->isVoidType())
2135         Self.Diag(SrcExpr.get()->getExprLoc(),
2136                   diag::warn_cast_pointer_from_sel)
2137         << SrcType << DestType << SrcExpr.get()->getSourceRange();
2138     }
2139 }
2140 
2141 /// Diagnose casts that change the calling convention of a pointer to a function
2142 /// defined in the current TU.
DiagnoseCallingConvCast(Sema & Self,const ExprResult & SrcExpr,QualType DstType,CastOperation::OpRangeType OpRange)2143 static void DiagnoseCallingConvCast(Sema &Self, const ExprResult &SrcExpr,
2144                                     QualType DstType,
2145                                     CastOperation::OpRangeType OpRange) {
2146   // Check if this cast would change the calling convention of a function
2147   // pointer type.
2148   QualType SrcType = SrcExpr.get()->getType();
2149   if (Self.Context.hasSameType(SrcType, DstType) ||
2150       !SrcType->isFunctionPointerType() || !DstType->isFunctionPointerType())
2151     return;
2152   const auto *SrcFTy =
2153       SrcType->castAs<PointerType>()->getPointeeType()->castAs<FunctionType>();
2154   const auto *DstFTy =
2155       DstType->castAs<PointerType>()->getPointeeType()->castAs<FunctionType>();
2156   CallingConv SrcCC = SrcFTy->getCallConv();
2157   CallingConv DstCC = DstFTy->getCallConv();
2158   if (SrcCC == DstCC)
2159     return;
2160 
2161   // We have a calling convention cast. Check if the source is a pointer to a
2162   // known, specific function that has already been defined.
2163   Expr *Src = SrcExpr.get()->IgnoreParenImpCasts();
2164   if (auto *UO = dyn_cast<UnaryOperator>(Src))
2165     if (UO->getOpcode() == UO_AddrOf)
2166       Src = UO->getSubExpr()->IgnoreParenImpCasts();
2167   auto *DRE = dyn_cast<DeclRefExpr>(Src);
2168   if (!DRE)
2169     return;
2170   auto *FD = dyn_cast<FunctionDecl>(DRE->getDecl());
2171   if (!FD)
2172     return;
2173 
2174   // Only warn if we are casting from the default convention to a non-default
2175   // convention. This can happen when the programmer forgot to apply the calling
2176   // convention to the function declaration and then inserted this cast to
2177   // satisfy the type system.
2178   CallingConv DefaultCC = Self.getASTContext().getDefaultCallingConvention(
2179       FD->isVariadic(), FD->isCXXInstanceMember());
2180   if (DstCC == DefaultCC || SrcCC != DefaultCC)
2181     return;
2182 
2183   // Diagnose this cast, as it is probably bad.
2184   StringRef SrcCCName = FunctionType::getNameForCallConv(SrcCC);
2185   StringRef DstCCName = FunctionType::getNameForCallConv(DstCC);
2186   Self.Diag(OpRange.getBegin(), diag::warn_cast_calling_conv)
2187       << SrcCCName << DstCCName << OpRange;
2188 
2189   // The checks above are cheaper than checking if the diagnostic is enabled.
2190   // However, it's worth checking if the warning is enabled before we construct
2191   // a fixit.
2192   if (Self.Diags.isIgnored(diag::warn_cast_calling_conv, OpRange.getBegin()))
2193     return;
2194 
2195   // Try to suggest a fixit to change the calling convention of the function
2196   // whose address was taken. Try to use the latest macro for the convention.
2197   // For example, users probably want to write "WINAPI" instead of "__stdcall"
2198   // to match the Windows header declarations.
2199   SourceLocation NameLoc = FD->getFirstDecl()->getNameInfo().getLoc();
2200   Preprocessor &PP = Self.getPreprocessor();
2201   SmallVector<TokenValue, 6> AttrTokens;
2202   SmallString<64> CCAttrText;
2203   llvm::raw_svector_ostream OS(CCAttrText);
2204   if (Self.getLangOpts().MicrosoftExt) {
2205     // __stdcall or __vectorcall
2206     OS << "__" << DstCCName;
2207     IdentifierInfo *II = PP.getIdentifierInfo(OS.str());
2208     AttrTokens.push_back(II->isKeyword(Self.getLangOpts())
2209                              ? TokenValue(II->getTokenID())
2210                              : TokenValue(II));
2211   } else {
2212     // __attribute__((stdcall)) or __attribute__((vectorcall))
2213     OS << "__attribute__((" << DstCCName << "))";
2214     AttrTokens.push_back(tok::kw___attribute);
2215     AttrTokens.push_back(tok::l_paren);
2216     AttrTokens.push_back(tok::l_paren);
2217     IdentifierInfo *II = PP.getIdentifierInfo(DstCCName);
2218     AttrTokens.push_back(II->isKeyword(Self.getLangOpts())
2219                              ? TokenValue(II->getTokenID())
2220                              : TokenValue(II));
2221     AttrTokens.push_back(tok::r_paren);
2222     AttrTokens.push_back(tok::r_paren);
2223   }
2224   StringRef AttrSpelling = PP.getLastMacroWithSpelling(NameLoc, AttrTokens);
2225   if (!AttrSpelling.empty())
2226     CCAttrText = AttrSpelling;
2227   OS << ' ';
2228   Self.Diag(NameLoc, diag::note_change_calling_conv_fixit)
2229       << FD << DstCCName << FixItHint::CreateInsertion(NameLoc, CCAttrText);
2230 }
2231 
checkIntToPointerCast(bool CStyle,const SourceRange & OpRange,const Expr * SrcExpr,QualType DestType,Sema & Self)2232 static void checkIntToPointerCast(bool CStyle, const SourceRange &OpRange,
2233                                   const Expr *SrcExpr, QualType DestType,
2234                                   Sema &Self) {
2235   QualType SrcType = SrcExpr->getType();
2236 
2237   // Not warning on reinterpret_cast, boolean, constant expressions, etc
2238   // are not explicit design choices, but consistent with GCC's behavior.
2239   // Feel free to modify them if you've reason/evidence for an alternative.
2240   if (CStyle && SrcType->isIntegralType(Self.Context)
2241       && !SrcType->isBooleanType()
2242       && !SrcType->isEnumeralType()
2243       && !SrcExpr->isIntegerConstantExpr(Self.Context)
2244       && Self.Context.getTypeSize(DestType) >
2245          Self.Context.getTypeSize(SrcType)) {
2246     // Separate between casts to void* and non-void* pointers.
2247     // Some APIs use (abuse) void* for something like a user context,
2248     // and often that value is an integer even if it isn't a pointer itself.
2249     // Having a separate warning flag allows users to control the warning
2250     // for their workflow.
2251     unsigned Diag = DestType->isVoidPointerType() ?
2252                       diag::warn_int_to_void_pointer_cast
2253                     : diag::warn_int_to_pointer_cast;
2254     Self.Diag(OpRange.getBegin(), Diag) << SrcType << DestType << OpRange;
2255   }
2256 }
2257 
fixOverloadedReinterpretCastExpr(Sema & Self,QualType DestType,ExprResult & Result)2258 static bool fixOverloadedReinterpretCastExpr(Sema &Self, QualType DestType,
2259                                              ExprResult &Result) {
2260   // We can only fix an overloaded reinterpret_cast if
2261   // - it is a template with explicit arguments that resolves to an lvalue
2262   //   unambiguously, or
2263   // - it is the only function in an overload set that may have its address
2264   //   taken.
2265 
2266   Expr *E = Result.get();
2267   // TODO: what if this fails because of DiagnoseUseOfDecl or something
2268   // like it?
2269   if (Self.ResolveAndFixSingleFunctionTemplateSpecialization(
2270           Result,
2271           Expr::getValueKindForType(DestType) ==
2272               VK_PRValue // Convert Fun to Ptr
2273           ) &&
2274       Result.isUsable())
2275     return true;
2276 
2277   // No guarantees that ResolveAndFixSingleFunctionTemplateSpecialization
2278   // preserves Result.
2279   Result = E;
2280   if (!Self.resolveAndFixAddressOfSingleOverloadCandidate(
2281           Result, /*DoFunctionPointerConversion=*/true))
2282     return false;
2283   return Result.isUsable();
2284 }
2285 
TryReinterpretCast(Sema & Self,ExprResult & SrcExpr,QualType DestType,bool CStyle,CastOperation::OpRangeType OpRange,unsigned & msg,CastKind & Kind)2286 static TryCastResult TryReinterpretCast(Sema &Self, ExprResult &SrcExpr,
2287                                         QualType DestType, bool CStyle,
2288                                         CastOperation::OpRangeType OpRange,
2289                                         unsigned &msg, CastKind &Kind) {
2290   bool IsLValueCast = false;
2291 
2292   DestType = Self.Context.getCanonicalType(DestType);
2293   QualType SrcType = SrcExpr.get()->getType();
2294 
2295   // Is the source an overloaded name? (i.e. &foo)
2296   // If so, reinterpret_cast generally can not help us here (13.4, p1, bullet 5)
2297   if (SrcType == Self.Context.OverloadTy) {
2298     ExprResult FixedExpr = SrcExpr;
2299     if (!fixOverloadedReinterpretCastExpr(Self, DestType, FixedExpr))
2300       return TC_NotApplicable;
2301 
2302     assert(FixedExpr.isUsable() && "Invalid result fixing overloaded expr");
2303     SrcExpr = FixedExpr;
2304     SrcType = SrcExpr.get()->getType();
2305   }
2306 
2307   if (const ReferenceType *DestTypeTmp = DestType->getAs<ReferenceType>()) {
2308     if (!SrcExpr.get()->isGLValue()) {
2309       // Cannot cast non-glvalue to (lvalue or rvalue) reference type. See the
2310       // similar comment in const_cast.
2311       msg = diag::err_bad_cxx_cast_rvalue;
2312       return TC_NotApplicable;
2313     }
2314 
2315     if (!CStyle) {
2316       Self.CheckCompatibleReinterpretCast(SrcType, DestType,
2317                                           /*IsDereference=*/false, OpRange);
2318     }
2319 
2320     // C++ 5.2.10p10: [...] a reference cast reinterpret_cast<T&>(x) has the
2321     //   same effect as the conversion *reinterpret_cast<T*>(&x) with the
2322     //   built-in & and * operators.
2323 
2324     const char *inappropriate = nullptr;
2325     switch (SrcExpr.get()->getObjectKind()) {
2326     case OK_Ordinary:
2327       break;
2328     case OK_BitField:
2329       msg = diag::err_bad_cxx_cast_bitfield;
2330       return TC_NotApplicable;
2331       // FIXME: Use a specific diagnostic for the rest of these cases.
2332     case OK_VectorComponent: inappropriate = "vector element";      break;
2333     case OK_MatrixComponent:
2334       inappropriate = "matrix element";
2335       break;
2336     case OK_ObjCProperty:    inappropriate = "property expression"; break;
2337     case OK_ObjCSubscript:   inappropriate = "container subscripting expression";
2338                              break;
2339     }
2340     if (inappropriate) {
2341       Self.Diag(OpRange.getBegin(), diag::err_bad_reinterpret_cast_reference)
2342           << inappropriate << DestType
2343           << OpRange << SrcExpr.get()->getSourceRange();
2344       msg = 0; SrcExpr = ExprError();
2345       return TC_NotApplicable;
2346     }
2347 
2348     // This code does this transformation for the checked types.
2349     DestType = Self.Context.getPointerType(DestTypeTmp->getPointeeType());
2350     SrcType = Self.Context.getPointerType(SrcType);
2351 
2352     IsLValueCast = true;
2353   }
2354 
2355   // Canonicalize source for comparison.
2356   SrcType = Self.Context.getCanonicalType(SrcType);
2357 
2358   const MemberPointerType *DestMemPtr = DestType->getAs<MemberPointerType>(),
2359                           *SrcMemPtr = SrcType->getAs<MemberPointerType>();
2360   if (DestMemPtr && SrcMemPtr) {
2361     // C++ 5.2.10p9: An rvalue of type "pointer to member of X of type T1"
2362     //   can be explicitly converted to an rvalue of type "pointer to member
2363     //   of Y of type T2" if T1 and T2 are both function types or both object
2364     //   types.
2365     if (DestMemPtr->isMemberFunctionPointer() !=
2366         SrcMemPtr->isMemberFunctionPointer())
2367       return TC_NotApplicable;
2368 
2369     if (Self.Context.getTargetInfo().getCXXABI().isMicrosoft()) {
2370       // We need to determine the inheritance model that the class will use if
2371       // haven't yet.
2372       (void)Self.isCompleteType(OpRange.getBegin(), SrcType);
2373       (void)Self.isCompleteType(OpRange.getBegin(), DestType);
2374     }
2375 
2376     // Don't allow casting between member pointers of different sizes.
2377     if (Self.Context.getTypeSize(DestMemPtr) !=
2378         Self.Context.getTypeSize(SrcMemPtr)) {
2379       msg = diag::err_bad_cxx_cast_member_pointer_size;
2380       return TC_Failed;
2381     }
2382 
2383     // C++ 5.2.10p2: The reinterpret_cast operator shall not cast away
2384     //   constness.
2385     // A reinterpret_cast followed by a const_cast can, though, so in C-style,
2386     // we accept it.
2387     if (auto CACK =
2388             CastsAwayConstness(Self, SrcType, DestType, /*CheckCVR=*/!CStyle,
2389                                /*CheckObjCLifetime=*/CStyle))
2390       return getCastAwayConstnessCastKind(CACK, msg);
2391 
2392     // A valid member pointer cast.
2393     assert(!IsLValueCast);
2394     Kind = CK_ReinterpretMemberPointer;
2395     return TC_Success;
2396   }
2397 
2398   // See below for the enumeral issue.
2399   if (SrcType->isNullPtrType() && DestType->isIntegralType(Self.Context)) {
2400     // C++0x 5.2.10p4: A pointer can be explicitly converted to any integral
2401     //   type large enough to hold it. A value of std::nullptr_t can be
2402     //   converted to an integral type; the conversion has the same meaning
2403     //   and validity as a conversion of (void*)0 to the integral type.
2404     if (Self.Context.getTypeSize(SrcType) >
2405         Self.Context.getTypeSize(DestType)) {
2406       msg = diag::err_bad_reinterpret_cast_small_int;
2407       return TC_Failed;
2408     }
2409     Kind = CK_PointerToIntegral;
2410     return TC_Success;
2411   }
2412 
2413   // Allow reinterpret_casts between vectors of the same size and
2414   // between vectors and integers of the same size.
2415   bool destIsVector = DestType->isVectorType();
2416   bool srcIsVector = SrcType->isVectorType();
2417   if (srcIsVector || destIsVector) {
2418     // Allow bitcasting between SVE VLATs and VLSTs, and vice-versa.
2419     if (Self.isValidSveBitcast(SrcType, DestType)) {
2420       Kind = CK_BitCast;
2421       return TC_Success;
2422     }
2423 
2424     // Allow bitcasting between SVE VLATs and VLSTs, and vice-versa.
2425     if (Self.RISCV().isValidRVVBitcast(SrcType, DestType)) {
2426       Kind = CK_BitCast;
2427       return TC_Success;
2428     }
2429 
2430     // The non-vector type, if any, must have integral type.  This is
2431     // the same rule that C vector casts use; note, however, that enum
2432     // types are not integral in C++.
2433     if ((!destIsVector && !DestType->isIntegralType(Self.Context)) ||
2434         (!srcIsVector && !SrcType->isIntegralType(Self.Context)))
2435       return TC_NotApplicable;
2436 
2437     // The size we want to consider is eltCount * eltSize.
2438     // That's exactly what the lax-conversion rules will check.
2439     if (Self.areLaxCompatibleVectorTypes(SrcType, DestType)) {
2440       Kind = CK_BitCast;
2441       return TC_Success;
2442     }
2443 
2444     if (Self.LangOpts.OpenCL && !CStyle) {
2445       if (DestType->isExtVectorType() || SrcType->isExtVectorType()) {
2446         // FIXME: Allow for reinterpret cast between 3 and 4 element vectors
2447         if (Self.areVectorTypesSameSize(SrcType, DestType)) {
2448           Kind = CK_BitCast;
2449           return TC_Success;
2450         }
2451       }
2452     }
2453 
2454     // Otherwise, pick a reasonable diagnostic.
2455     if (!destIsVector)
2456       msg = diag::err_bad_cxx_cast_vector_to_scalar_different_size;
2457     else if (!srcIsVector)
2458       msg = diag::err_bad_cxx_cast_scalar_to_vector_different_size;
2459     else
2460       msg = diag::err_bad_cxx_cast_vector_to_vector_different_size;
2461 
2462     return TC_Failed;
2463   }
2464 
2465   if (SrcType == DestType) {
2466     // C++ 5.2.10p2 has a note that mentions that, subject to all other
2467     // restrictions, a cast to the same type is allowed so long as it does not
2468     // cast away constness. In C++98, the intent was not entirely clear here,
2469     // since all other paragraphs explicitly forbid casts to the same type.
2470     // C++11 clarifies this case with p2.
2471     //
2472     // The only allowed types are: integral, enumeration, pointer, or
2473     // pointer-to-member types.  We also won't restrict Obj-C pointers either.
2474     Kind = CK_NoOp;
2475     TryCastResult Result = TC_NotApplicable;
2476     if (SrcType->isIntegralOrEnumerationType() ||
2477         SrcType->isAnyPointerType() ||
2478         SrcType->isMemberPointerType() ||
2479         SrcType->isBlockPointerType()) {
2480       Result = TC_Success;
2481     }
2482     return Result;
2483   }
2484 
2485   bool destIsPtr = DestType->isAnyPointerType() ||
2486                    DestType->isBlockPointerType();
2487   bool srcIsPtr = SrcType->isAnyPointerType() ||
2488                   SrcType->isBlockPointerType();
2489   if (!destIsPtr && !srcIsPtr) {
2490     // Except for std::nullptr_t->integer and lvalue->reference, which are
2491     // handled above, at least one of the two arguments must be a pointer.
2492     return TC_NotApplicable;
2493   }
2494 
2495   if (DestType->isIntegralType(Self.Context)) {
2496     assert(srcIsPtr && "One type must be a pointer");
2497     // C++ 5.2.10p4: A pointer can be explicitly converted to any integral
2498     //   type large enough to hold it; except in Microsoft mode, where the
2499     //   integral type size doesn't matter (except we don't allow bool).
2500     if ((Self.Context.getTypeSize(SrcType) >
2501          Self.Context.getTypeSize(DestType))) {
2502       bool MicrosoftException =
2503           Self.getLangOpts().MicrosoftExt && !DestType->isBooleanType();
2504       if (MicrosoftException) {
2505         unsigned Diag = SrcType->isVoidPointerType()
2506                             ? diag::warn_void_pointer_to_int_cast
2507                             : diag::warn_pointer_to_int_cast;
2508         Self.Diag(OpRange.getBegin(), Diag) << SrcType << DestType << OpRange;
2509       } else {
2510         msg = diag::err_bad_reinterpret_cast_small_int;
2511         return TC_Failed;
2512       }
2513     }
2514     Kind = CK_PointerToIntegral;
2515     return TC_Success;
2516   }
2517 
2518   if (SrcType->isIntegralOrEnumerationType()) {
2519     assert(destIsPtr && "One type must be a pointer");
2520     checkIntToPointerCast(CStyle, OpRange, SrcExpr.get(), DestType, Self);
2521     // C++ 5.2.10p5: A value of integral or enumeration type can be explicitly
2522     //   converted to a pointer.
2523     // C++ 5.2.10p9: [Note: ...a null pointer constant of integral type is not
2524     //   necessarily converted to a null pointer value.]
2525     Kind = CK_IntegralToPointer;
2526     return TC_Success;
2527   }
2528 
2529   if (!destIsPtr || !srcIsPtr) {
2530     // With the valid non-pointer conversions out of the way, we can be even
2531     // more stringent.
2532     return TC_NotApplicable;
2533   }
2534 
2535   // Cannot convert between block pointers and Objective-C object pointers.
2536   if ((SrcType->isBlockPointerType() && DestType->isObjCObjectPointerType()) ||
2537       (DestType->isBlockPointerType() && SrcType->isObjCObjectPointerType()))
2538     return TC_NotApplicable;
2539 
2540   // C++ 5.2.10p2: The reinterpret_cast operator shall not cast away constness.
2541   // The C-style cast operator can.
2542   TryCastResult SuccessResult = TC_Success;
2543   if (auto CACK =
2544           CastsAwayConstness(Self, SrcType, DestType, /*CheckCVR=*/!CStyle,
2545                              /*CheckObjCLifetime=*/CStyle))
2546     SuccessResult = getCastAwayConstnessCastKind(CACK, msg);
2547 
2548   if (IsAddressSpaceConversion(SrcType, DestType)) {
2549     Kind = CK_AddressSpaceConversion;
2550     assert(SrcType->isPointerType() && DestType->isPointerType());
2551     if (!CStyle &&
2552         !DestType->getPointeeType().getQualifiers().isAddressSpaceSupersetOf(
2553             SrcType->getPointeeType().getQualifiers(), Self.getASTContext())) {
2554       SuccessResult = TC_Failed;
2555     }
2556   } else if (IsLValueCast) {
2557     Kind = CK_LValueBitCast;
2558   } else if (DestType->isObjCObjectPointerType()) {
2559     Kind = Self.ObjC().PrepareCastToObjCObjectPointer(SrcExpr);
2560   } else if (DestType->isBlockPointerType()) {
2561     if (!SrcType->isBlockPointerType()) {
2562       Kind = CK_AnyPointerToBlockPointerCast;
2563     } else {
2564       Kind = CK_BitCast;
2565     }
2566   } else {
2567     Kind = CK_BitCast;
2568   }
2569 
2570   // Any pointer can be cast to an Objective-C pointer type with a C-style
2571   // cast.
2572   if (CStyle && DestType->isObjCObjectPointerType()) {
2573     return SuccessResult;
2574   }
2575   if (CStyle)
2576     DiagnoseCastOfObjCSEL(Self, SrcExpr, DestType);
2577 
2578   DiagnoseCallingConvCast(Self, SrcExpr, DestType, OpRange);
2579 
2580   // Not casting away constness, so the only remaining check is for compatible
2581   // pointer categories.
2582 
2583   if (SrcType->isFunctionPointerType()) {
2584     if (DestType->isFunctionPointerType()) {
2585       // C++ 5.2.10p6: A pointer to a function can be explicitly converted to
2586       // a pointer to a function of a different type.
2587       return SuccessResult;
2588     }
2589 
2590     // C++0x 5.2.10p8: Converting a pointer to a function into a pointer to
2591     //   an object type or vice versa is conditionally-supported.
2592     // Compilers support it in C++03 too, though, because it's necessary for
2593     // casting the return value of dlsym() and GetProcAddress().
2594     // FIXME: Conditionally-supported behavior should be configurable in the
2595     // TargetInfo or similar.
2596     Self.Diag(OpRange.getBegin(),
2597               Self.getLangOpts().CPlusPlus11 ?
2598                 diag::warn_cxx98_compat_cast_fn_obj : diag::ext_cast_fn_obj)
2599       << OpRange;
2600     return SuccessResult;
2601   }
2602 
2603   if (DestType->isFunctionPointerType()) {
2604     // See above.
2605     Self.Diag(OpRange.getBegin(),
2606               Self.getLangOpts().CPlusPlus11 ?
2607                 diag::warn_cxx98_compat_cast_fn_obj : diag::ext_cast_fn_obj)
2608       << OpRange;
2609     return SuccessResult;
2610   }
2611 
2612   // Diagnose address space conversion in nested pointers.
2613   QualType DestPtee = DestType->getPointeeType().isNull()
2614                           ? DestType->getPointeeType()
2615                           : DestType->getPointeeType()->getPointeeType();
2616   QualType SrcPtee = SrcType->getPointeeType().isNull()
2617                          ? SrcType->getPointeeType()
2618                          : SrcType->getPointeeType()->getPointeeType();
2619   while (!DestPtee.isNull() && !SrcPtee.isNull()) {
2620     if (DestPtee.getAddressSpace() != SrcPtee.getAddressSpace()) {
2621       Self.Diag(OpRange.getBegin(),
2622                 diag::warn_bad_cxx_cast_nested_pointer_addr_space)
2623           << CStyle << SrcType << DestType << SrcExpr.get()->getSourceRange();
2624       break;
2625     }
2626     DestPtee = DestPtee->getPointeeType();
2627     SrcPtee = SrcPtee->getPointeeType();
2628   }
2629 
2630   // C++ 5.2.10p7: A pointer to an object can be explicitly converted to
2631   //   a pointer to an object of different type.
2632   // Void pointers are not specified, but supported by every compiler out there.
2633   // So we finish by allowing everything that remains - it's got to be two
2634   // object pointers.
2635   return SuccessResult;
2636 }
2637 
TryAddressSpaceCast(Sema & Self,ExprResult & SrcExpr,QualType DestType,bool CStyle,unsigned & msg,CastKind & Kind)2638 static TryCastResult TryAddressSpaceCast(Sema &Self, ExprResult &SrcExpr,
2639                                          QualType DestType, bool CStyle,
2640                                          unsigned &msg, CastKind &Kind) {
2641   if (!Self.getLangOpts().OpenCL && !Self.getLangOpts().SYCLIsDevice)
2642     // FIXME: As compiler doesn't have any information about overlapping addr
2643     // spaces at the moment we have to be permissive here.
2644     return TC_NotApplicable;
2645   // Even though the logic below is general enough and can be applied to
2646   // non-OpenCL mode too, we fast-path above because no other languages
2647   // define overlapping address spaces currently.
2648   auto SrcType = SrcExpr.get()->getType();
2649   // FIXME: Should this be generalized to references? The reference parameter
2650   // however becomes a reference pointee type here and therefore rejected.
2651   // Perhaps this is the right behavior though according to C++.
2652   auto SrcPtrType = SrcType->getAs<PointerType>();
2653   if (!SrcPtrType)
2654     return TC_NotApplicable;
2655   auto DestPtrType = DestType->getAs<PointerType>();
2656   if (!DestPtrType)
2657     return TC_NotApplicable;
2658   auto SrcPointeeType = SrcPtrType->getPointeeType();
2659   auto DestPointeeType = DestPtrType->getPointeeType();
2660   if (!DestPointeeType.isAddressSpaceOverlapping(SrcPointeeType,
2661                                                  Self.getASTContext())) {
2662     msg = diag::err_bad_cxx_cast_addr_space_mismatch;
2663     return TC_Failed;
2664   }
2665   auto SrcPointeeTypeWithoutAS =
2666       Self.Context.removeAddrSpaceQualType(SrcPointeeType.getCanonicalType());
2667   auto DestPointeeTypeWithoutAS =
2668       Self.Context.removeAddrSpaceQualType(DestPointeeType.getCanonicalType());
2669   if (Self.Context.hasSameType(SrcPointeeTypeWithoutAS,
2670                                DestPointeeTypeWithoutAS)) {
2671     Kind = SrcPointeeType.getAddressSpace() == DestPointeeType.getAddressSpace()
2672                ? CK_NoOp
2673                : CK_AddressSpaceConversion;
2674     return TC_Success;
2675   } else {
2676     return TC_NotApplicable;
2677   }
2678 }
2679 
checkAddressSpaceCast(QualType SrcType,QualType DestType)2680 void CastOperation::checkAddressSpaceCast(QualType SrcType, QualType DestType) {
2681   // In OpenCL only conversions between pointers to objects in overlapping
2682   // addr spaces are allowed. v2.0 s6.5.5 - Generic addr space overlaps
2683   // with any named one, except for constant.
2684 
2685   // Converting the top level pointee addrspace is permitted for compatible
2686   // addrspaces (such as 'generic int *' to 'local int *' or vice versa), but
2687   // if any of the nested pointee addrspaces differ, we emit a warning
2688   // regardless of addrspace compatibility. This makes
2689   //   local int ** p;
2690   //   return (generic int **) p;
2691   // warn even though local -> generic is permitted.
2692   if (Self.getLangOpts().OpenCL) {
2693     const Type *DestPtr, *SrcPtr;
2694     bool Nested = false;
2695     unsigned DiagID = diag::err_typecheck_incompatible_address_space;
2696     DestPtr = Self.getASTContext().getCanonicalType(DestType.getTypePtr()),
2697     SrcPtr  = Self.getASTContext().getCanonicalType(SrcType.getTypePtr());
2698 
2699     while (isa<PointerType>(DestPtr) && isa<PointerType>(SrcPtr)) {
2700       const PointerType *DestPPtr = cast<PointerType>(DestPtr);
2701       const PointerType *SrcPPtr = cast<PointerType>(SrcPtr);
2702       QualType DestPPointee = DestPPtr->getPointeeType();
2703       QualType SrcPPointee = SrcPPtr->getPointeeType();
2704       if (Nested
2705               ? DestPPointee.getAddressSpace() != SrcPPointee.getAddressSpace()
2706               : !DestPPointee.isAddressSpaceOverlapping(SrcPPointee,
2707                                                         Self.getASTContext())) {
2708         Self.Diag(OpRange.getBegin(), DiagID)
2709             << SrcType << DestType << AssignmentAction::Casting
2710             << SrcExpr.get()->getSourceRange();
2711         if (!Nested)
2712           SrcExpr = ExprError();
2713         return;
2714       }
2715 
2716       DestPtr = DestPPtr->getPointeeType().getTypePtr();
2717       SrcPtr = SrcPPtr->getPointeeType().getTypePtr();
2718       Nested = true;
2719       DiagID = diag::ext_nested_pointer_qualifier_mismatch;
2720     }
2721   }
2722 }
2723 
ShouldSplatAltivecScalarInCast(const VectorType * VecTy)2724 bool Sema::ShouldSplatAltivecScalarInCast(const VectorType *VecTy) {
2725   bool SrcCompatXL = this->getLangOpts().getAltivecSrcCompat() ==
2726                      LangOptions::AltivecSrcCompatKind::XL;
2727   VectorKind VKind = VecTy->getVectorKind();
2728 
2729   if ((VKind == VectorKind::AltiVecVector) ||
2730       (SrcCompatXL && ((VKind == VectorKind::AltiVecBool) ||
2731                        (VKind == VectorKind::AltiVecPixel)))) {
2732     return true;
2733   }
2734   return false;
2735 }
2736 
CheckAltivecInitFromScalar(SourceRange R,QualType VecTy,QualType SrcTy)2737 bool Sema::CheckAltivecInitFromScalar(SourceRange R, QualType VecTy,
2738                                       QualType SrcTy) {
2739   bool SrcCompatGCC = this->getLangOpts().getAltivecSrcCompat() ==
2740                       LangOptions::AltivecSrcCompatKind::GCC;
2741   if (this->getLangOpts().AltiVec && SrcCompatGCC) {
2742     this->Diag(R.getBegin(),
2743                diag::err_invalid_conversion_between_vector_and_integer)
2744         << VecTy << SrcTy << R;
2745     return true;
2746   }
2747   return false;
2748 }
2749 
CheckCXXCStyleCast(bool FunctionalStyle,bool ListInitialization)2750 void CastOperation::CheckCXXCStyleCast(bool FunctionalStyle,
2751                                        bool ListInitialization) {
2752   assert(Self.getLangOpts().CPlusPlus);
2753 
2754   // Handle placeholders.
2755   if (isPlaceholder()) {
2756     // C-style casts can resolve __unknown_any types.
2757     if (claimPlaceholder(BuiltinType::UnknownAny)) {
2758       SrcExpr = Self.checkUnknownAnyCast(DestRange, DestType,
2759                                          SrcExpr.get(), Kind,
2760                                          ValueKind, BasePath);
2761       return;
2762     }
2763 
2764     checkNonOverloadPlaceholders();
2765     if (SrcExpr.isInvalid())
2766       return;
2767   }
2768 
2769   // C++ 5.2.9p4: Any expression can be explicitly converted to type "cv void".
2770   // This test is outside everything else because it's the only case where
2771   // a non-lvalue-reference target type does not lead to decay.
2772   if (DestType->isVoidType()) {
2773     Kind = CK_ToVoid;
2774 
2775     if (claimPlaceholder(BuiltinType::Overload)) {
2776       Self.ResolveAndFixSingleFunctionTemplateSpecialization(
2777                   SrcExpr, /* Decay Function to ptr */ false,
2778                   /* Complain */ true, DestRange, DestType,
2779                   diag::err_bad_cstyle_cast_overload);
2780       if (SrcExpr.isInvalid())
2781         return;
2782     }
2783 
2784     SrcExpr = Self.IgnoredValueConversions(SrcExpr.get());
2785     return;
2786   }
2787 
2788   // If the type is dependent, we won't do any other semantic analysis now.
2789   if (DestType->isDependentType() || SrcExpr.get()->isTypeDependent() ||
2790       SrcExpr.get()->isValueDependent()) {
2791     assert(Kind == CK_Dependent);
2792     return;
2793   }
2794 
2795   CheckedConversionKind CCK = FunctionalStyle
2796                                   ? CheckedConversionKind::FunctionalCast
2797                                   : CheckedConversionKind::CStyleCast;
2798   if (Self.getLangOpts().HLSL) {
2799     if (CheckHLSLCStyleCast(CCK))
2800       return;
2801   }
2802 
2803   if (ValueKind == VK_PRValue && !DestType->isRecordType() &&
2804       !isPlaceholder(BuiltinType::Overload)) {
2805     SrcExpr = Self.DefaultFunctionArrayLvalueConversion(SrcExpr.get());
2806     if (SrcExpr.isInvalid())
2807       return;
2808   }
2809 
2810   // AltiVec vector initialization with a single literal.
2811   if (const VectorType *vecTy = DestType->getAs<VectorType>()) {
2812     if (Self.CheckAltivecInitFromScalar(OpRange, DestType,
2813                                         SrcExpr.get()->getType())) {
2814       SrcExpr = ExprError();
2815       return;
2816     }
2817     if (Self.ShouldSplatAltivecScalarInCast(vecTy) &&
2818         (SrcExpr.get()->getType()->isIntegerType() ||
2819          SrcExpr.get()->getType()->isFloatingType())) {
2820       Kind = CK_VectorSplat;
2821       SrcExpr = Self.prepareVectorSplat(DestType, SrcExpr.get());
2822       return;
2823     }
2824   }
2825 
2826   // WebAssembly tables cannot be cast.
2827   QualType SrcType = SrcExpr.get()->getType();
2828   if (SrcType->isWebAssemblyTableType()) {
2829     Self.Diag(OpRange.getBegin(), diag::err_wasm_cast_table)
2830         << 1 << SrcExpr.get()->getSourceRange();
2831     SrcExpr = ExprError();
2832     return;
2833   }
2834 
2835   // C++ [expr.cast]p5: The conversions performed by
2836   //   - a const_cast,
2837   //   - a static_cast,
2838   //   - a static_cast followed by a const_cast,
2839   //   - a reinterpret_cast, or
2840   //   - a reinterpret_cast followed by a const_cast,
2841   //   can be performed using the cast notation of explicit type conversion.
2842   //   [...] If a conversion can be interpreted in more than one of the ways
2843   //   listed above, the interpretation that appears first in the list is used,
2844   //   even if a cast resulting from that interpretation is ill-formed.
2845   // In plain language, this means trying a const_cast ...
2846   // Note that for address space we check compatibility after const_cast.
2847   unsigned msg = diag::err_bad_cxx_cast_generic;
2848   TryCastResult tcr = TryConstCast(Self, SrcExpr, DestType,
2849                                    /*CStyle*/ true, msg);
2850   if (SrcExpr.isInvalid())
2851     return;
2852   if (isValidCast(tcr))
2853     Kind = CK_NoOp;
2854 
2855   if (tcr == TC_NotApplicable) {
2856     tcr = TryAddressSpaceCast(Self, SrcExpr, DestType, /*CStyle*/ true, msg,
2857                               Kind);
2858     if (SrcExpr.isInvalid())
2859       return;
2860 
2861     if (tcr == TC_NotApplicable) {
2862       // ... or if that is not possible, a static_cast, ignoring const and
2863       // addr space, ...
2864       tcr = TryStaticCast(Self, SrcExpr, DestType, CCK, OpRange, msg, Kind,
2865                           BasePath, ListInitialization);
2866       if (SrcExpr.isInvalid())
2867         return;
2868 
2869       if (tcr == TC_NotApplicable) {
2870         // ... and finally a reinterpret_cast, ignoring const and addr space.
2871         tcr = TryReinterpretCast(Self, SrcExpr, DestType, /*CStyle*/ true,
2872                                  OpRange, msg, Kind);
2873         if (SrcExpr.isInvalid())
2874           return;
2875       }
2876     }
2877   }
2878 
2879   if (Self.getLangOpts().allowsNonTrivialObjCLifetimeQualifiers() &&
2880       isValidCast(tcr))
2881     checkObjCConversion(CCK);
2882 
2883   if (tcr != TC_Success && msg != 0) {
2884     if (SrcExpr.get()->getType() == Self.Context.OverloadTy) {
2885       DeclAccessPair Found;
2886       FunctionDecl *Fn = Self.ResolveAddressOfOverloadedFunction(SrcExpr.get(),
2887                                 DestType,
2888                                 /*Complain*/ true,
2889                                 Found);
2890       if (Fn) {
2891         // If DestType is a function type (not to be confused with the function
2892         // pointer type), it will be possible to resolve the function address,
2893         // but the type cast should be considered as failure.
2894         OverloadExpr *OE = OverloadExpr::find(SrcExpr.get()).Expression;
2895         Self.Diag(OpRange.getBegin(), diag::err_bad_cstyle_cast_overload)
2896           << OE->getName() << DestType << OpRange
2897           << OE->getQualifierLoc().getSourceRange();
2898         Self.NoteAllOverloadCandidates(SrcExpr.get());
2899       }
2900     } else {
2901       diagnoseBadCast(Self, msg, (FunctionalStyle ? CT_Functional : CT_CStyle),
2902                       OpRange, SrcExpr.get(), DestType, ListInitialization);
2903     }
2904   }
2905 
2906   if (isValidCast(tcr)) {
2907     if (Kind == CK_BitCast)
2908       checkCastAlign();
2909 
2910     if (unsigned DiagID = checkCastFunctionType(Self, SrcExpr, DestType))
2911       Self.Diag(OpRange.getBegin(), DiagID)
2912           << SrcExpr.get()->getType() << DestType << OpRange;
2913 
2914   } else {
2915     SrcExpr = ExprError();
2916   }
2917 }
2918 
2919 // CheckHLSLCStyleCast - Returns `true` ihe cast is handled or errored as an
2920 // HLSL-specific cast. Returns false if the cast should be checked as a CXX
2921 // C-Style cast.
CheckHLSLCStyleCast(CheckedConversionKind CCK)2922 bool CastOperation::CheckHLSLCStyleCast(CheckedConversionKind CCK) {
2923   assert(Self.getLangOpts().HLSL && "Must be HLSL!");
2924   QualType SrcTy = SrcExpr.get()->getType();
2925   // HLSL has several unique forms of C-style casts which support aggregate to
2926   // aggregate casting.
2927   // This case should not trigger on regular vector cast, vector truncation
2928   if (Self.HLSL().CanPerformElementwiseCast(SrcExpr.get(), DestType)) {
2929     if (SrcTy->isConstantArrayType())
2930       SrcExpr = Self.ImpCastExprToType(
2931           SrcExpr.get(), Self.Context.getArrayParameterType(SrcTy),
2932           CK_HLSLArrayRValue, VK_PRValue, nullptr, CCK);
2933     Kind = CK_HLSLElementwiseCast;
2934     return true;
2935   }
2936 
2937   // This case should not trigger on regular vector splat
2938   // If the relative order of this and the HLSLElementWise cast checks
2939   // are changed, it might change which cast handles what in a few cases
2940   if (Self.HLSL().CanPerformAggregateSplatCast(SrcExpr.get(), DestType)) {
2941     const VectorType *VT = SrcTy->getAs<VectorType>();
2942     // change splat from vec1 case to splat from scalar
2943     if (VT && VT->getNumElements() == 1)
2944       SrcExpr = Self.ImpCastExprToType(
2945           SrcExpr.get(), VT->getElementType(), CK_HLSLVectorTruncation,
2946           SrcExpr.get()->getValueKind(), nullptr, CCK);
2947     // Inserting a scalar cast here allows for a simplified codegen in
2948     // the case the destTy is a vector
2949     if (const VectorType *DVT = DestType->getAs<VectorType>())
2950       SrcExpr = Self.ImpCastExprToType(
2951           SrcExpr.get(), DVT->getElementType(),
2952           Self.PrepareScalarCast(SrcExpr, DVT->getElementType()),
2953           SrcExpr.get()->getValueKind(), nullptr, CCK);
2954     Kind = CK_HLSLAggregateSplatCast;
2955     return true;
2956   }
2957 
2958   // If the destination is an array, we've exhausted the valid HLSL casts, so we
2959   // should emit a dignostic and stop processing.
2960   if (DestType->isArrayType()) {
2961     Self.Diag(OpRange.getBegin(), diag::err_bad_cxx_cast_generic)
2962         << 4 << SrcTy << DestType;
2963     SrcExpr = ExprError();
2964     return true;
2965   }
2966   return false;
2967 }
2968 
2969 /// DiagnoseBadFunctionCast - Warn whenever a function call is cast to a
2970 ///  non-matching type. Such as enum function call to int, int call to
2971 /// pointer; etc. Cast to 'void' is an exception.
DiagnoseBadFunctionCast(Sema & Self,const ExprResult & SrcExpr,QualType DestType)2972 static void DiagnoseBadFunctionCast(Sema &Self, const ExprResult &SrcExpr,
2973                                   QualType DestType) {
2974   if (Self.Diags.isIgnored(diag::warn_bad_function_cast,
2975                            SrcExpr.get()->getExprLoc()))
2976     return;
2977 
2978   if (!isa<CallExpr>(SrcExpr.get()))
2979     return;
2980 
2981   QualType SrcType = SrcExpr.get()->getType();
2982   if (DestType.getUnqualifiedType()->isVoidType())
2983     return;
2984   if ((SrcType->isAnyPointerType() || SrcType->isBlockPointerType())
2985       && (DestType->isAnyPointerType() || DestType->isBlockPointerType()))
2986     return;
2987   if (SrcType->isIntegerType() && DestType->isIntegerType() &&
2988       (SrcType->isBooleanType() == DestType->isBooleanType()) &&
2989       (SrcType->isEnumeralType() == DestType->isEnumeralType()))
2990     return;
2991   if (SrcType->isRealFloatingType() && DestType->isRealFloatingType())
2992     return;
2993   if (SrcType->isEnumeralType() && DestType->isEnumeralType())
2994     return;
2995   if (SrcType->isComplexType() && DestType->isComplexType())
2996     return;
2997   if (SrcType->isComplexIntegerType() && DestType->isComplexIntegerType())
2998     return;
2999   if (SrcType->isFixedPointType() && DestType->isFixedPointType())
3000     return;
3001 
3002   Self.Diag(SrcExpr.get()->getExprLoc(),
3003             diag::warn_bad_function_cast)
3004             << SrcType << DestType << SrcExpr.get()->getSourceRange();
3005 }
3006 
3007 /// Check the semantics of a C-style cast operation, in C.
CheckCStyleCast()3008 void CastOperation::CheckCStyleCast() {
3009   assert(!Self.getLangOpts().CPlusPlus);
3010 
3011   // C-style casts can resolve __unknown_any types.
3012   if (claimPlaceholder(BuiltinType::UnknownAny)) {
3013     SrcExpr = Self.checkUnknownAnyCast(DestRange, DestType,
3014                                        SrcExpr.get(), Kind,
3015                                        ValueKind, BasePath);
3016     return;
3017   }
3018 
3019   // C99 6.5.4p2: the cast type needs to be void or scalar and the expression
3020   // type needs to be scalar.
3021   if (DestType->isVoidType()) {
3022     // We don't necessarily do lvalue-to-rvalue conversions on this.
3023     SrcExpr = Self.IgnoredValueConversions(SrcExpr.get());
3024     if (SrcExpr.isInvalid())
3025       return;
3026 
3027     // Cast to void allows any expr type.
3028     Kind = CK_ToVoid;
3029     return;
3030   }
3031 
3032   // If the type is dependent, we won't do any other semantic analysis now.
3033   if (Self.getASTContext().isDependenceAllowed() &&
3034       (DestType->isDependentType() || SrcExpr.get()->isTypeDependent() ||
3035        SrcExpr.get()->isValueDependent())) {
3036     assert((DestType->containsErrors() || SrcExpr.get()->containsErrors() ||
3037             SrcExpr.get()->containsErrors()) &&
3038            "should only occur in error-recovery path.");
3039     assert(Kind == CK_Dependent);
3040     return;
3041   }
3042 
3043   // Overloads are allowed with C extensions, so we need to support them.
3044   if (SrcExpr.get()->getType() == Self.Context.OverloadTy) {
3045     DeclAccessPair DAP;
3046     if (FunctionDecl *FD = Self.ResolveAddressOfOverloadedFunction(
3047             SrcExpr.get(), DestType, /*Complain=*/true, DAP))
3048       SrcExpr = Self.FixOverloadedFunctionReference(SrcExpr.get(), DAP, FD);
3049     else
3050       return;
3051     assert(SrcExpr.isUsable());
3052   }
3053   SrcExpr = Self.DefaultFunctionArrayLvalueConversion(SrcExpr.get());
3054   if (SrcExpr.isInvalid())
3055     return;
3056   QualType SrcType = SrcExpr.get()->getType();
3057 
3058   if (SrcType->isWebAssemblyTableType()) {
3059     Self.Diag(OpRange.getBegin(), diag::err_wasm_cast_table)
3060         << 1 << SrcExpr.get()->getSourceRange();
3061     SrcExpr = ExprError();
3062     return;
3063   }
3064 
3065   assert(!SrcType->isPlaceholderType());
3066 
3067   checkAddressSpaceCast(SrcType, DestType);
3068   if (SrcExpr.isInvalid())
3069     return;
3070 
3071   if (Self.RequireCompleteType(OpRange.getBegin(), DestType,
3072                                diag::err_typecheck_cast_to_incomplete)) {
3073     SrcExpr = ExprError();
3074     return;
3075   }
3076 
3077   // Allow casting a sizeless built-in type to itself.
3078   if (DestType->isSizelessBuiltinType() &&
3079       Self.Context.hasSameUnqualifiedType(DestType, SrcType)) {
3080     Kind = CK_NoOp;
3081     return;
3082   }
3083 
3084   // Allow bitcasting between compatible SVE vector types.
3085   if ((SrcType->isVectorType() || DestType->isVectorType()) &&
3086       Self.isValidSveBitcast(SrcType, DestType)) {
3087     Kind = CK_BitCast;
3088     return;
3089   }
3090 
3091   // Allow bitcasting between compatible RVV vector types.
3092   if ((SrcType->isVectorType() || DestType->isVectorType()) &&
3093       Self.RISCV().isValidRVVBitcast(SrcType, DestType)) {
3094     Kind = CK_BitCast;
3095     return;
3096   }
3097 
3098   if (!DestType->isScalarType() && !DestType->isVectorType() &&
3099       !DestType->isMatrixType()) {
3100     const RecordType *DestRecordTy = DestType->getAs<RecordType>();
3101 
3102     if (DestRecordTy && Self.Context.hasSameUnqualifiedType(DestType, SrcType)){
3103       // GCC struct/union extension: allow cast to self.
3104       Self.Diag(OpRange.getBegin(), diag::ext_typecheck_cast_nonscalar)
3105         << DestType << SrcExpr.get()->getSourceRange();
3106       Kind = CK_NoOp;
3107       return;
3108     }
3109 
3110     // GCC's cast to union extension.
3111     if (DestRecordTy && DestRecordTy->getDecl()->isUnion()) {
3112       RecordDecl *RD = DestRecordTy->getDecl();
3113       if (CastExpr::getTargetFieldForToUnionCast(RD, SrcType)) {
3114         Self.Diag(OpRange.getBegin(), diag::ext_typecheck_cast_to_union)
3115           << SrcExpr.get()->getSourceRange();
3116         Kind = CK_ToUnion;
3117         return;
3118       } else {
3119         Self.Diag(OpRange.getBegin(), diag::err_typecheck_cast_to_union_no_type)
3120           << SrcType << SrcExpr.get()->getSourceRange();
3121         SrcExpr = ExprError();
3122         return;
3123       }
3124     }
3125 
3126     // OpenCL v2.0 s6.13.10 - Allow casts from '0' to event_t type.
3127     if (Self.getLangOpts().OpenCL && DestType->isEventT()) {
3128       Expr::EvalResult Result;
3129       if (SrcExpr.get()->EvaluateAsInt(Result, Self.Context)) {
3130         llvm::APSInt CastInt = Result.Val.getInt();
3131         if (0 == CastInt) {
3132           Kind = CK_ZeroToOCLOpaqueType;
3133           return;
3134         }
3135         Self.Diag(OpRange.getBegin(),
3136                   diag::err_opencl_cast_non_zero_to_event_t)
3137                   << toString(CastInt, 10) << SrcExpr.get()->getSourceRange();
3138         SrcExpr = ExprError();
3139         return;
3140       }
3141     }
3142 
3143     // Reject any other conversions to non-scalar types.
3144     Self.Diag(OpRange.getBegin(), diag::err_typecheck_cond_expect_scalar)
3145       << DestType << SrcExpr.get()->getSourceRange();
3146     SrcExpr = ExprError();
3147     return;
3148   }
3149 
3150   // The type we're casting to is known to be a scalar, a vector, or a matrix.
3151 
3152   // Require the operand to be a scalar, a vector, or a matrix.
3153   if (!SrcType->isScalarType() && !SrcType->isVectorType() &&
3154       !SrcType->isMatrixType()) {
3155     Self.Diag(SrcExpr.get()->getExprLoc(),
3156               diag::err_typecheck_expect_scalar_operand)
3157       << SrcType << SrcExpr.get()->getSourceRange();
3158     SrcExpr = ExprError();
3159     return;
3160   }
3161 
3162   // C23 6.5.5p4:
3163   //   ... The type nullptr_t shall not be converted to any type other than
3164   //   void, bool or a pointer type.If the target type is nullptr_t, the cast
3165   //   expression shall be a null pointer constant or have type nullptr_t.
3166   if (SrcType->isNullPtrType()) {
3167     // FIXME: 6.3.2.4p2 says that nullptr_t can be converted to itself, but
3168     // 6.5.4p4 is a constraint check and nullptr_t is not void, bool, or a
3169     // pointer type. We're not going to diagnose that as a constraint violation.
3170     if (!DestType->isVoidType() && !DestType->isBooleanType() &&
3171         !DestType->isPointerType() && !DestType->isNullPtrType()) {
3172       Self.Diag(SrcExpr.get()->getExprLoc(), diag::err_nullptr_cast)
3173           << /*nullptr to type*/ 0 << DestType;
3174       SrcExpr = ExprError();
3175       return;
3176     }
3177     if (!DestType->isNullPtrType()) {
3178       // Implicitly cast from the null pointer type to the type of the
3179       // destination.
3180       CastKind CK = DestType->isPointerType() ? CK_NullToPointer : CK_BitCast;
3181       SrcExpr = ImplicitCastExpr::Create(Self.Context, DestType, CK,
3182                                          SrcExpr.get(), nullptr, VK_PRValue,
3183                                          Self.CurFPFeatureOverrides());
3184     }
3185   }
3186 
3187   if (DestType->isNullPtrType() && !SrcType->isNullPtrType()) {
3188     if (!SrcExpr.get()->isNullPointerConstant(Self.Context,
3189                                               Expr::NPC_NeverValueDependent)) {
3190       Self.Diag(SrcExpr.get()->getExprLoc(), diag::err_nullptr_cast)
3191           << /*type to nullptr*/ 1 << SrcType;
3192       SrcExpr = ExprError();
3193       return;
3194     }
3195     // Need to convert the source from whatever its type is to a null pointer
3196     // type first.
3197     SrcExpr = ImplicitCastExpr::Create(Self.Context, DestType, CK_NullToPointer,
3198                                        SrcExpr.get(), nullptr, VK_PRValue,
3199                                        Self.CurFPFeatureOverrides());
3200   }
3201 
3202   if (DestType->isExtVectorType()) {
3203     SrcExpr = Self.CheckExtVectorCast(OpRange, DestType, SrcExpr.get(), Kind);
3204     return;
3205   }
3206 
3207   if (DestType->getAs<MatrixType>() || SrcType->getAs<MatrixType>()) {
3208     if (Self.CheckMatrixCast(OpRange, DestType, SrcType, Kind))
3209       SrcExpr = ExprError();
3210     return;
3211   }
3212 
3213   if (const VectorType *DestVecTy = DestType->getAs<VectorType>()) {
3214     if (Self.CheckAltivecInitFromScalar(OpRange, DestType, SrcType)) {
3215       SrcExpr = ExprError();
3216       return;
3217     }
3218     if (Self.ShouldSplatAltivecScalarInCast(DestVecTy) &&
3219         (SrcType->isIntegerType() || SrcType->isFloatingType())) {
3220       Kind = CK_VectorSplat;
3221       SrcExpr = Self.prepareVectorSplat(DestType, SrcExpr.get());
3222     } else if (Self.CheckVectorCast(OpRange, DestType, SrcType, Kind)) {
3223       SrcExpr = ExprError();
3224     }
3225     return;
3226   }
3227 
3228   if (SrcType->isVectorType()) {
3229     if (Self.CheckVectorCast(OpRange, SrcType, DestType, Kind))
3230       SrcExpr = ExprError();
3231     return;
3232   }
3233 
3234   // The source and target types are both scalars, i.e.
3235   //   - arithmetic types (fundamental, enum, and complex)
3236   //   - all kinds of pointers
3237   // Note that member pointers were filtered out with C++, above.
3238 
3239   if (isa<ObjCSelectorExpr>(SrcExpr.get())) {
3240     Self.Diag(SrcExpr.get()->getExprLoc(), diag::err_cast_selector_expr);
3241     SrcExpr = ExprError();
3242     return;
3243   }
3244 
3245   // If either type is a pointer, the other type has to be either an
3246   // integer or a pointer.
3247   if (!DestType->isArithmeticType()) {
3248     if (!SrcType->isIntegralType(Self.Context) && SrcType->isArithmeticType()) {
3249       Self.Diag(SrcExpr.get()->getExprLoc(),
3250                 diag::err_cast_pointer_from_non_pointer_int)
3251         << SrcType << SrcExpr.get()->getSourceRange();
3252       SrcExpr = ExprError();
3253       return;
3254     }
3255     checkIntToPointerCast(/* CStyle */ true, OpRange, SrcExpr.get(), DestType,
3256                           Self);
3257   } else if (!SrcType->isArithmeticType()) {
3258     if (!DestType->isIntegralType(Self.Context) &&
3259         DestType->isArithmeticType()) {
3260       Self.Diag(SrcExpr.get()->getBeginLoc(),
3261                 diag::err_cast_pointer_to_non_pointer_int)
3262           << DestType << SrcExpr.get()->getSourceRange();
3263       SrcExpr = ExprError();
3264       return;
3265     }
3266 
3267     if ((Self.Context.getTypeSize(SrcType) >
3268          Self.Context.getTypeSize(DestType)) &&
3269         !DestType->isBooleanType()) {
3270       // C 6.3.2.3p6: Any pointer type may be converted to an integer type.
3271       // Except as previously specified, the result is implementation-defined.
3272       // If the result cannot be represented in the integer type, the behavior
3273       // is undefined. The result need not be in the range of values of any
3274       // integer type.
3275       unsigned Diag;
3276       if (SrcType->isVoidPointerType())
3277         Diag = DestType->isEnumeralType() ? diag::warn_void_pointer_to_enum_cast
3278                                           : diag::warn_void_pointer_to_int_cast;
3279       else if (DestType->isEnumeralType())
3280         Diag = diag::warn_pointer_to_enum_cast;
3281       else
3282         Diag = diag::warn_pointer_to_int_cast;
3283       Self.Diag(OpRange.getBegin(), Diag) << SrcType << DestType << OpRange;
3284     }
3285   }
3286 
3287   if (Self.getLangOpts().OpenCL && !Self.getOpenCLOptions().isAvailableOption(
3288                                        "cl_khr_fp16", Self.getLangOpts())) {
3289     if (DestType->isHalfType()) {
3290       Self.Diag(SrcExpr.get()->getBeginLoc(), diag::err_opencl_cast_to_half)
3291           << DestType << SrcExpr.get()->getSourceRange();
3292       SrcExpr = ExprError();
3293       return;
3294     }
3295   }
3296 
3297   // ARC imposes extra restrictions on casts.
3298   if (Self.getLangOpts().allowsNonTrivialObjCLifetimeQualifiers()) {
3299     checkObjCConversion(CheckedConversionKind::CStyleCast);
3300     if (SrcExpr.isInvalid())
3301       return;
3302 
3303     const PointerType *CastPtr = DestType->getAs<PointerType>();
3304     if (Self.getLangOpts().ObjCAutoRefCount && CastPtr) {
3305       if (const PointerType *ExprPtr = SrcType->getAs<PointerType>()) {
3306         Qualifiers CastQuals = CastPtr->getPointeeType().getQualifiers();
3307         Qualifiers ExprQuals = ExprPtr->getPointeeType().getQualifiers();
3308         if (CastPtr->getPointeeType()->isObjCLifetimeType() &&
3309             ExprPtr->getPointeeType()->isObjCLifetimeType() &&
3310             !CastQuals.compatiblyIncludesObjCLifetime(ExprQuals)) {
3311           Self.Diag(SrcExpr.get()->getBeginLoc(),
3312                     diag::err_typecheck_incompatible_ownership)
3313               << SrcType << DestType << AssignmentAction::Casting
3314               << SrcExpr.get()->getSourceRange();
3315           return;
3316         }
3317       }
3318     } else if (!Self.ObjC().CheckObjCARCUnavailableWeakConversion(DestType,
3319                                                                   SrcType)) {
3320       Self.Diag(SrcExpr.get()->getBeginLoc(),
3321                 diag::err_arc_convesion_of_weak_unavailable)
3322           << 1 << SrcType << DestType << SrcExpr.get()->getSourceRange();
3323       SrcExpr = ExprError();
3324       return;
3325     }
3326   }
3327 
3328   if (unsigned DiagID = checkCastFunctionType(Self, SrcExpr, DestType))
3329     Self.Diag(OpRange.getBegin(), DiagID) << SrcType << DestType << OpRange;
3330 
3331   if (isa<PointerType>(SrcType) && isa<PointerType>(DestType)) {
3332     QualType SrcTy = cast<PointerType>(SrcType)->getPointeeType();
3333     QualType DestTy = cast<PointerType>(DestType)->getPointeeType();
3334 
3335     const RecordDecl *SrcRD = SrcTy->getAsRecordDecl();
3336     const RecordDecl *DestRD = DestTy->getAsRecordDecl();
3337 
3338     if (SrcRD && DestRD && SrcRD->hasAttr<RandomizeLayoutAttr>() &&
3339         SrcRD != DestRD) {
3340       // The struct we are casting the pointer from was randomized.
3341       Self.Diag(OpRange.getBegin(), diag::err_cast_from_randomized_struct)
3342           << SrcType << DestType;
3343       SrcExpr = ExprError();
3344       return;
3345     }
3346   }
3347 
3348   DiagnoseCastOfObjCSEL(Self, SrcExpr, DestType);
3349   DiagnoseCallingConvCast(Self, SrcExpr, DestType, OpRange);
3350   DiagnoseBadFunctionCast(Self, SrcExpr, DestType);
3351   Kind = Self.PrepareScalarCast(SrcExpr, DestType);
3352   if (SrcExpr.isInvalid())
3353     return;
3354 
3355   if (Kind == CK_BitCast)
3356     checkCastAlign();
3357 }
3358 
CheckBuiltinBitCast()3359 void CastOperation::CheckBuiltinBitCast() {
3360   QualType SrcType = SrcExpr.get()->getType();
3361 
3362   if (Self.RequireCompleteType(OpRange.getBegin(), DestType,
3363                                diag::err_typecheck_cast_to_incomplete) ||
3364       Self.RequireCompleteType(OpRange.getBegin(), SrcType,
3365                                diag::err_incomplete_type)) {
3366     SrcExpr = ExprError();
3367     return;
3368   }
3369 
3370   if (SrcExpr.get()->isPRValue())
3371     SrcExpr = Self.CreateMaterializeTemporaryExpr(SrcType, SrcExpr.get(),
3372                                                   /*IsLValueReference=*/false);
3373 
3374   CharUnits DestSize = Self.Context.getTypeSizeInChars(DestType);
3375   CharUnits SourceSize = Self.Context.getTypeSizeInChars(SrcType);
3376   if (DestSize != SourceSize) {
3377     Self.Diag(OpRange.getBegin(), diag::err_bit_cast_type_size_mismatch)
3378         << SrcType << DestType << (int)SourceSize.getQuantity()
3379         << (int)DestSize.getQuantity();
3380     SrcExpr = ExprError();
3381     return;
3382   }
3383 
3384   if (!DestType.isTriviallyCopyableType(Self.Context)) {
3385     Self.Diag(OpRange.getBegin(), diag::err_bit_cast_non_trivially_copyable)
3386         << 1;
3387     SrcExpr = ExprError();
3388     return;
3389   }
3390 
3391   if (!SrcType.isTriviallyCopyableType(Self.Context)) {
3392     Self.Diag(OpRange.getBegin(), diag::err_bit_cast_non_trivially_copyable)
3393         << 0;
3394     SrcExpr = ExprError();
3395     return;
3396   }
3397 
3398   Kind = CK_LValueToRValueBitCast;
3399 }
3400 
3401 /// DiagnoseCastQual - Warn whenever casts discards a qualifiers, be it either
3402 /// const, volatile or both.
DiagnoseCastQual(Sema & Self,const ExprResult & SrcExpr,QualType DestType)3403 static void DiagnoseCastQual(Sema &Self, const ExprResult &SrcExpr,
3404                              QualType DestType) {
3405   if (SrcExpr.isInvalid())
3406     return;
3407 
3408   QualType SrcType = SrcExpr.get()->getType();
3409   if (!((SrcType->isAnyPointerType() && DestType->isAnyPointerType()) ||
3410         DestType->isLValueReferenceType()))
3411     return;
3412 
3413   QualType TheOffendingSrcType, TheOffendingDestType;
3414   Qualifiers CastAwayQualifiers;
3415   if (CastsAwayConstness(Self, SrcType, DestType, true, false,
3416                          &TheOffendingSrcType, &TheOffendingDestType,
3417                          &CastAwayQualifiers) !=
3418       CastAwayConstnessKind::CACK_Similar)
3419     return;
3420 
3421   // FIXME: 'restrict' is not properly handled here.
3422   int qualifiers = -1;
3423   if (CastAwayQualifiers.hasConst() && CastAwayQualifiers.hasVolatile()) {
3424     qualifiers = 0;
3425   } else if (CastAwayQualifiers.hasConst()) {
3426     qualifiers = 1;
3427   } else if (CastAwayQualifiers.hasVolatile()) {
3428     qualifiers = 2;
3429   }
3430   // This is a variant of int **x; const int **y = (const int **)x;
3431   if (qualifiers == -1)
3432     Self.Diag(SrcExpr.get()->getBeginLoc(), diag::warn_cast_qual2)
3433         << SrcType << DestType;
3434   else
3435     Self.Diag(SrcExpr.get()->getBeginLoc(), diag::warn_cast_qual)
3436         << TheOffendingSrcType << TheOffendingDestType << qualifiers;
3437 }
3438 
BuildCStyleCastExpr(SourceLocation LPLoc,TypeSourceInfo * CastTypeInfo,SourceLocation RPLoc,Expr * CastExpr)3439 ExprResult Sema::BuildCStyleCastExpr(SourceLocation LPLoc,
3440                                      TypeSourceInfo *CastTypeInfo,
3441                                      SourceLocation RPLoc,
3442                                      Expr *CastExpr) {
3443   CastOperation Op(*this, CastTypeInfo->getType(), CastExpr);
3444   Op.DestRange = CastTypeInfo->getTypeLoc().getSourceRange();
3445   Op.OpRange = CastOperation::OpRangeType(LPLoc, LPLoc, CastExpr->getEndLoc());
3446 
3447   if (getLangOpts().CPlusPlus) {
3448     Op.CheckCXXCStyleCast(/*FunctionalCast=*/ false,
3449                           isa<InitListExpr>(CastExpr));
3450   } else {
3451     Op.CheckCStyleCast();
3452   }
3453 
3454   if (Op.SrcExpr.isInvalid())
3455     return ExprError();
3456 
3457   // -Wcast-qual
3458   DiagnoseCastQual(Op.Self, Op.SrcExpr, Op.DestType);
3459 
3460   Op.checkQualifiedDestType();
3461 
3462   return Op.complete(CStyleCastExpr::Create(
3463       Context, Op.ResultType, Op.ValueKind, Op.Kind, Op.SrcExpr.get(),
3464       &Op.BasePath, CurFPFeatureOverrides(), CastTypeInfo, LPLoc, RPLoc));
3465 }
3466 
BuildCXXFunctionalCastExpr(TypeSourceInfo * CastTypeInfo,QualType Type,SourceLocation LPLoc,Expr * CastExpr,SourceLocation RPLoc)3467 ExprResult Sema::BuildCXXFunctionalCastExpr(TypeSourceInfo *CastTypeInfo,
3468                                             QualType Type,
3469                                             SourceLocation LPLoc,
3470                                             Expr *CastExpr,
3471                                             SourceLocation RPLoc) {
3472   assert(LPLoc.isValid() && "List-initialization shouldn't get here.");
3473   CastOperation Op(*this, Type, CastExpr);
3474   Op.DestRange = CastTypeInfo->getTypeLoc().getSourceRange();
3475   Op.OpRange =
3476       CastOperation::OpRangeType(Op.DestRange.getBegin(), LPLoc, RPLoc);
3477 
3478   Op.CheckCXXCStyleCast(/*FunctionalCast=*/true, /*ListInit=*/false);
3479   if (Op.SrcExpr.isInvalid())
3480     return ExprError();
3481 
3482   Op.checkQualifiedDestType();
3483 
3484   // -Wcast-qual
3485   DiagnoseCastQual(Op.Self, Op.SrcExpr, Op.DestType);
3486 
3487   return Op.complete(CXXFunctionalCastExpr::Create(
3488       Context, Op.ResultType, Op.ValueKind, CastTypeInfo, Op.Kind,
3489       Op.SrcExpr.get(), &Op.BasePath, CurFPFeatureOverrides(), LPLoc, RPLoc));
3490 }
3491