Changeset View
Changeset View
Standalone View
Standalone View
clang/lib/Sema/SemaExprCXX.cpp
- This file is larger than 256 KB, so syntax highlighting is disabled by default.
Show First 20 Lines • Show All 4,851 Lines • ▼ Show 20 Lines | static bool CheckUnaryTypeTraitTypeCompleteness(Sema &S, TypeTrait UTT, | ||||
case UTT_IsTriviallyCopyConstructible: | case UTT_IsTriviallyCopyConstructible: | ||||
case UTT_IsNothrowCopyConstructible: | case UTT_IsNothrowCopyConstructible: | ||||
case UTT_IsCopyAssignable: | case UTT_IsCopyAssignable: | ||||
case UTT_IsTriviallyCopyAssignable: | case UTT_IsTriviallyCopyAssignable: | ||||
case UTT_IsNothrowCopyAssignable: | case UTT_IsNothrowCopyAssignable: | ||||
case UTT_IsMoveConstructible: | case UTT_IsMoveConstructible: | ||||
case UTT_IsTriviallyMoveConstructible: | case UTT_IsTriviallyMoveConstructible: | ||||
case UTT_IsNothrowMoveConstructible: | case UTT_IsNothrowMoveConstructible: | ||||
case UTT_IsMoveAssignable: | |||||
case UTT_IsTriviallyMoveAssignable: | |||||
case UTT_IsNothrowMoveAssignable: | |||||
if (ArgTy->isIncompleteArrayType() || ArgTy->isVoidType()) | if (ArgTy->isIncompleteArrayType() || ArgTy->isVoidType()) | ||||
return true; | return true; | ||||
return !S.RequireCompleteType( | return !S.RequireCompleteType( | ||||
Loc, ArgTy, diag::err_incomplete_type_used_in_type_trait_expr); | Loc, ArgTy, diag::err_incomplete_type_used_in_type_trait_expr); | ||||
} | } | ||||
} | } | ||||
▲ Show 20 Lines • Show All 483 Lines • ▼ Show 20 Lines | return evaluateTypeTrait(Self, | ||||
UTT == UTT_IsCopyConstructible ? TT_IsConstructible | UTT == UTT_IsCopyConstructible ? TT_IsConstructible | ||||
: UTT == UTT_IsTriviallyCopyConstructible | : UTT == UTT_IsTriviallyCopyConstructible | ||||
? TT_IsTriviallyConstructible | ? TT_IsTriviallyConstructible | ||||
: TT_IsNothrowConstructible, | : TT_IsNothrowConstructible, | ||||
KeyLoc, Parameters, {}); | KeyLoc, Parameters, {}); | ||||
} | } | ||||
case UTT_IsMoveConstructible: | case UTT_IsMoveConstructible: | ||||
case UTT_IsTriviallyMoveConstructible: | case UTT_IsTriviallyMoveConstructible: | ||||
case UTT_IsNothrowMoveConstructible: { | case UTT_IsNothrowMoveConstructible: | ||||
case UTT_IsMoveAssignable: | |||||
case UTT_IsTriviallyMoveAssignable: | |||||
case UTT_IsNothrowMoveAssignable: { | |||||
if (T->isIncompleteArrayType()) | if (T->isIncompleteArrayType()) | ||||
return false; | return false; | ||||
if (!T.isReferenceable()) | if (!T.isReferenceable()) | ||||
return false; | return false; | ||||
QualType AssigneeType = Self.BuiltinAddReference( | QualType AssigneeType = Self.BuiltinAddReference( | ||||
T, UnaryTransformType::AddRvalueReference, KeyLoc); | T, UnaryTransformType::AddRvalueReference, KeyLoc); | ||||
if (UTT == UTT_IsMoveAssignable || UTT == UTT_IsTriviallyMoveAssignable || | |||||
UTT == UTT_IsNothrowMoveAssignable) | |||||
return EvaluateBinaryTypeTrait( | |||||
Self, | |||||
UTT == UTT_IsMoveAssignable ? BTT_IsAssignable | |||||
: UTT == UTT_IsTriviallyMoveAssignable ? BTT_IsTriviallyAssignable | |||||
: BTT_IsNothrowAssignable, | |||||
Self.BuildReferenceType(T, true, KeyLoc, T.getBaseTypeIdentifier()), | |||||
AssigneeType, KeyLoc); | |||||
llvm::SmallVector<TypeSourceInfo *, 2> Parameters = { | llvm::SmallVector<TypeSourceInfo *, 2> Parameters = { | ||||
C.CreateTypeSourceInfo(T), C.CreateTypeSourceInfo(AssigneeType)}; | C.CreateTypeSourceInfo(T), C.CreateTypeSourceInfo(AssigneeType)}; | ||||
return evaluateTypeTrait(Self, | return evaluateTypeTrait(Self, | ||||
UTT == UTT_IsMoveConstructible ? TT_IsConstructible | UTT == UTT_IsMoveConstructible ? TT_IsConstructible | ||||
: UTT == UTT_IsTriviallyMoveConstructible | : UTT == UTT_IsTriviallyMoveConstructible | ||||
? TT_IsTriviallyConstructible | ? TT_IsTriviallyConstructible | ||||
: TT_IsNothrowConstructible, | : TT_IsNothrowConstructible, | ||||
KeyLoc, Parameters, {}); | KeyLoc, Parameters, {}); | ||||
▲ Show 20 Lines • Show All 130 Lines • ▼ Show 20 Lines | |||||
void DiagnoseBuiltinDeprecation(Sema& S, TypeTrait Kind, | void DiagnoseBuiltinDeprecation(Sema& S, TypeTrait Kind, | ||||
SourceLocation KWLoc) { | SourceLocation KWLoc) { | ||||
TypeTrait Replacement; | TypeTrait Replacement; | ||||
switch (Kind) { | switch (Kind) { | ||||
case UTT_HasNothrowAssign: // despite its name, this checks copy assignment | case UTT_HasNothrowAssign: // despite its name, this checks copy assignment | ||||
Replacement = UTT_IsNothrowCopyAssignable; | Replacement = UTT_IsNothrowCopyAssignable; | ||||
break; | break; | ||||
case UTT_HasNothrowMoveAssign: | case UTT_HasNothrowMoveAssign: | ||||
Replacement = BTT_IsNothrowAssignable; | Replacement = UTT_IsNothrowMoveAssignable; | ||||
break; | break; | ||||
case UTT_HasNothrowCopy: | case UTT_HasNothrowCopy: | ||||
Replacement = UTT_IsNothrowCopyConstructible; | Replacement = UTT_IsNothrowCopyConstructible; | ||||
break; | break; | ||||
case UTT_HasNothrowConstructor: | case UTT_HasNothrowConstructor: | ||||
Replacement = TT_IsNothrowConstructible; | Replacement = TT_IsNothrowConstructible; | ||||
break; | break; | ||||
case UTT_HasTrivialAssign: // despite its name, this checks copy assignment | case UTT_HasTrivialAssign: // despite its name, this checks copy assignment | ||||
Replacement = UTT_IsTriviallyCopyAssignable; | Replacement = UTT_IsTriviallyCopyAssignable; | ||||
break; | break; | ||||
case UTT_HasTrivialMoveAssign: | case UTT_HasTrivialMoveAssign: | ||||
Replacement = BTT_IsTriviallyAssignable; | Replacement = UTT_IsTriviallyMoveAssignable; | ||||
break; | break; | ||||
case UTT_HasTrivialCopy: | case UTT_HasTrivialCopy: | ||||
Replacement = UTT_IsTriviallyCopyConstructible; | Replacement = UTT_IsTriviallyCopyConstructible; | ||||
break; | break; | ||||
case UTT_HasTrivialDefaultConstructor: | case UTT_HasTrivialDefaultConstructor: | ||||
Replacement = TT_IsTriviallyConstructible; | Replacement = TT_IsTriviallyConstructible; | ||||
break; | break; | ||||
case UTT_HasTrivialMoveConstructor: | case UTT_HasTrivialMoveConstructor: | ||||
▲ Show 20 Lines • Show All 3,611 Lines • Show Last 20 Lines |