mirror of
https://github.com/opnsense/src.git
synced 2026-06-14 19:20:18 -04:00
Merge commit bbb8a0df7367 from llvm-project (by Shafik Yaghmour):
[Clang] Fix ResolveConstructorOverload to not select a conversion function if we are going use copy elision ResolveConstructorOverload needs to check properly if we are going to use copy elision we can't use a conversion function. This fixes: https://github.com/llvm/llvm-project/issues/39319 https://github.com/llvm/llvm-project/issues/60182 https://github.com/llvm/llvm-project/issues/62157 https://github.com/llvm/llvm-project/issues/64885 https://github.com/llvm/llvm-project/issues/65568 Differential Revision: https://reviews.llvm.org/D148474 This should fix 'Assertion failed: (isa<To>(Val) && "cast<Ty>() argument of incompatible type!")' errors when building devel/boost-libs, specifically libs/url/src/segments_view.cpp. Bump __FreeBSD_version so this fix can easily be detected from devel/boost-all/compiled.mk. PR: 273335
This commit is contained in:
parent
9978c6289d
commit
bcd401b5a3
3 changed files with 30 additions and 27 deletions
|
|
@ -4092,16 +4092,13 @@ static bool hasCopyOrMoveCtorParam(ASTContext &Ctx,
|
|||
return Ctx.hasSameUnqualifiedType(ParmT, ClassT);
|
||||
}
|
||||
|
||||
static OverloadingResult
|
||||
ResolveConstructorOverload(Sema &S, SourceLocation DeclLoc,
|
||||
MultiExprArg Args,
|
||||
OverloadCandidateSet &CandidateSet,
|
||||
QualType DestType,
|
||||
DeclContext::lookup_result Ctors,
|
||||
OverloadCandidateSet::iterator &Best,
|
||||
bool CopyInitializing, bool AllowExplicit,
|
||||
bool OnlyListConstructors, bool IsListInit,
|
||||
bool SecondStepOfCopyInit = false) {
|
||||
static OverloadingResult ResolveConstructorOverload(
|
||||
Sema &S, SourceLocation DeclLoc, MultiExprArg Args,
|
||||
OverloadCandidateSet &CandidateSet, QualType DestType,
|
||||
DeclContext::lookup_result Ctors, OverloadCandidateSet::iterator &Best,
|
||||
bool CopyInitializing, bool AllowExplicit, bool OnlyListConstructors,
|
||||
bool IsListInit, bool RequireActualConstructor,
|
||||
bool SecondStepOfCopyInit = false) {
|
||||
CandidateSet.clear(OverloadCandidateSet::CSK_InitByConstructor);
|
||||
CandidateSet.setDestAS(DestType.getQualifiers().getAddressSpace());
|
||||
|
||||
|
|
@ -4164,7 +4161,7 @@ ResolveConstructorOverload(Sema &S, SourceLocation DeclLoc,
|
|||
// Note: SecondStepOfCopyInit is only ever true in this case when
|
||||
// evaluating whether to produce a C++98 compatibility warning.
|
||||
if (S.getLangOpts().CPlusPlus17 && Args.size() == 1 &&
|
||||
!SecondStepOfCopyInit) {
|
||||
!RequireActualConstructor && !SecondStepOfCopyInit) {
|
||||
Expr *Initializer = Args[0];
|
||||
auto *SourceRD = Initializer->getType()->getAsCXXRecordDecl();
|
||||
if (SourceRD && S.isCompleteType(DeclLoc, Initializer->getType())) {
|
||||
|
|
@ -4232,6 +4229,12 @@ static void TryConstructorInitialization(Sema &S,
|
|||
return;
|
||||
}
|
||||
|
||||
bool RequireActualConstructor =
|
||||
!(Entity.getKind() != InitializedEntity::EK_Base &&
|
||||
Entity.getKind() != InitializedEntity::EK_Delegating &&
|
||||
Entity.getKind() !=
|
||||
InitializedEntity::EK_LambdaToBlockConversionBlockElement);
|
||||
|
||||
// C++17 [dcl.init]p17:
|
||||
// - If the initializer expression is a prvalue and the cv-unqualified
|
||||
// version of the source type is the same class as the class of the
|
||||
|
|
@ -4241,11 +4244,7 @@ static void TryConstructorInitialization(Sema &S,
|
|||
// class or delegating to another constructor from a mem-initializer.
|
||||
// ObjC++: Lambda captured by the block in the lambda to block conversion
|
||||
// should avoid copy elision.
|
||||
if (S.getLangOpts().CPlusPlus17 &&
|
||||
Entity.getKind() != InitializedEntity::EK_Base &&
|
||||
Entity.getKind() != InitializedEntity::EK_Delegating &&
|
||||
Entity.getKind() !=
|
||||
InitializedEntity::EK_LambdaToBlockConversionBlockElement &&
|
||||
if (S.getLangOpts().CPlusPlus17 && !RequireActualConstructor &&
|
||||
UnwrappedArgs.size() == 1 && UnwrappedArgs[0]->isPRValue() &&
|
||||
S.Context.hasSameUnqualifiedType(UnwrappedArgs[0]->getType(), DestType)) {
|
||||
// Convert qualifications if necessary.
|
||||
|
|
@ -4293,11 +4292,10 @@ static void TryConstructorInitialization(Sema &S,
|
|||
// If the initializer list has no elements and T has a default constructor,
|
||||
// the first phase is omitted.
|
||||
if (!(UnwrappedArgs.empty() && S.LookupDefaultConstructor(DestRecordDecl)))
|
||||
Result = ResolveConstructorOverload(S, Kind.getLocation(), Args,
|
||||
CandidateSet, DestType, Ctors, Best,
|
||||
CopyInitialization, AllowExplicit,
|
||||
/*OnlyListConstructors=*/true,
|
||||
IsListInit);
|
||||
Result = ResolveConstructorOverload(
|
||||
S, Kind.getLocation(), Args, CandidateSet, DestType, Ctors, Best,
|
||||
CopyInitialization, AllowExplicit,
|
||||
/*OnlyListConstructors=*/true, IsListInit, RequireActualConstructor);
|
||||
}
|
||||
|
||||
// C++11 [over.match.list]p1:
|
||||
|
|
@ -4307,11 +4305,10 @@ static void TryConstructorInitialization(Sema &S,
|
|||
// elements of the initializer list.
|
||||
if (Result == OR_No_Viable_Function) {
|
||||
AsInitializerList = false;
|
||||
Result = ResolveConstructorOverload(S, Kind.getLocation(), UnwrappedArgs,
|
||||
CandidateSet, DestType, Ctors, Best,
|
||||
CopyInitialization, AllowExplicit,
|
||||
/*OnlyListConstructors=*/false,
|
||||
IsListInit);
|
||||
Result = ResolveConstructorOverload(
|
||||
S, Kind.getLocation(), UnwrappedArgs, CandidateSet, DestType, Ctors,
|
||||
Best, CopyInitialization, AllowExplicit,
|
||||
/*OnlyListConstructors=*/false, IsListInit, RequireActualConstructor);
|
||||
}
|
||||
if (Result) {
|
||||
Sequence.SetOverloadFailure(
|
||||
|
|
@ -6776,6 +6773,7 @@ static ExprResult CopyObject(Sema &S,
|
|||
S, Loc, CurInitExpr, CandidateSet, T, Ctors, Best,
|
||||
/*CopyInitializing=*/false, /*AllowExplicit=*/true,
|
||||
/*OnlyListConstructors=*/false, /*IsListInit=*/false,
|
||||
/*RequireActualConstructor=*/false,
|
||||
/*SecondStepOfCopyInit=*/true)) {
|
||||
case OR_Success:
|
||||
break;
|
||||
|
|
@ -6921,6 +6919,7 @@ static void CheckCXX98CompatAccessibleCopy(Sema &S,
|
|||
S, Loc, CurInitExpr, CandidateSet, CurInitExpr->getType(), Ctors, Best,
|
||||
/*CopyInitializing=*/false, /*AllowExplicit=*/true,
|
||||
/*OnlyListConstructors=*/false, /*IsListInit=*/false,
|
||||
/*RequireActualConstructor=*/false,
|
||||
/*SecondStepOfCopyInit=*/true);
|
||||
|
||||
PartialDiagnostic Diag = S.PDiag(diag::warn_cxx98_compat_temp_copy)
|
||||
|
|
|
|||
|
|
@ -790,6 +790,10 @@ void Sema::PrintInstantiationStack() {
|
|||
Diags.Report(Active->PointOfInstantiation,
|
||||
diag::note_template_nsdmi_here)
|
||||
<< FD << Active->InstantiationRange;
|
||||
} else if (ClassTemplateDecl *CTD = dyn_cast<ClassTemplateDecl>(D)) {
|
||||
Diags.Report(Active->PointOfInstantiation,
|
||||
diag::note_template_class_instantiation_here)
|
||||
<< CTD << Active->InstantiationRange;
|
||||
} else {
|
||||
Diags.Report(Active->PointOfInstantiation,
|
||||
diag::note_template_type_alias_instantiation_here)
|
||||
|
|
|
|||
|
|
@ -73,7 +73,7 @@
|
|||
* cannot include sys/param.h and should only be updated here.
|
||||
*/
|
||||
#undef __FreeBSD_version
|
||||
#define __FreeBSD_version 1500016
|
||||
#define __FreeBSD_version 1500017
|
||||
|
||||
/*
|
||||
* __FreeBSD_kernel__ indicates that this system uses the kernel of FreeBSD,
|
||||
|
|
|
|||
Loading…
Reference in a new issue