|
@@ -580,6 +580,7 @@ clang::MakeDeductionFailureInfo(ASTContext &Context,
|
|
case Sema::TDK_TooManyArguments:
|
|
case Sema::TDK_TooManyArguments:
|
|
case Sema::TDK_TooFewArguments:
|
|
case Sema::TDK_TooFewArguments:
|
|
case Sema::TDK_MiscellaneousDeductionFailure:
|
|
case Sema::TDK_MiscellaneousDeductionFailure:
|
|
|
|
+ case Sema::TDK_CUDATargetMismatch:
|
|
Result.Data = nullptr;
|
|
Result.Data = nullptr;
|
|
break;
|
|
break;
|
|
|
|
|
|
@@ -647,6 +648,7 @@ void DeductionFailureInfo::Destroy() {
|
|
case Sema::TDK_TooFewArguments:
|
|
case Sema::TDK_TooFewArguments:
|
|
case Sema::TDK_InvalidExplicitArguments:
|
|
case Sema::TDK_InvalidExplicitArguments:
|
|
case Sema::TDK_FailedOverloadResolution:
|
|
case Sema::TDK_FailedOverloadResolution:
|
|
|
|
+ case Sema::TDK_CUDATargetMismatch:
|
|
break;
|
|
break;
|
|
|
|
|
|
case Sema::TDK_Inconsistent:
|
|
case Sema::TDK_Inconsistent:
|
|
@@ -689,6 +691,7 @@ TemplateParameter DeductionFailureInfo::getTemplateParameter() {
|
|
case Sema::TDK_DeducedMismatch:
|
|
case Sema::TDK_DeducedMismatch:
|
|
case Sema::TDK_NonDeducedMismatch:
|
|
case Sema::TDK_NonDeducedMismatch:
|
|
case Sema::TDK_FailedOverloadResolution:
|
|
case Sema::TDK_FailedOverloadResolution:
|
|
|
|
+ case Sema::TDK_CUDATargetMismatch:
|
|
return TemplateParameter();
|
|
return TemplateParameter();
|
|
|
|
|
|
case Sema::TDK_Incomplete:
|
|
case Sema::TDK_Incomplete:
|
|
@@ -720,6 +723,7 @@ TemplateArgumentList *DeductionFailureInfo::getTemplateArgumentList() {
|
|
case Sema::TDK_Underqualified:
|
|
case Sema::TDK_Underqualified:
|
|
case Sema::TDK_NonDeducedMismatch:
|
|
case Sema::TDK_NonDeducedMismatch:
|
|
case Sema::TDK_FailedOverloadResolution:
|
|
case Sema::TDK_FailedOverloadResolution:
|
|
|
|
+ case Sema::TDK_CUDATargetMismatch:
|
|
return nullptr;
|
|
return nullptr;
|
|
|
|
|
|
case Sema::TDK_DeducedMismatch:
|
|
case Sema::TDK_DeducedMismatch:
|
|
@@ -747,6 +751,7 @@ const TemplateArgument *DeductionFailureInfo::getFirstArg() {
|
|
case Sema::TDK_InvalidExplicitArguments:
|
|
case Sema::TDK_InvalidExplicitArguments:
|
|
case Sema::TDK_SubstitutionFailure:
|
|
case Sema::TDK_SubstitutionFailure:
|
|
case Sema::TDK_FailedOverloadResolution:
|
|
case Sema::TDK_FailedOverloadResolution:
|
|
|
|
+ case Sema::TDK_CUDATargetMismatch:
|
|
return nullptr;
|
|
return nullptr;
|
|
|
|
|
|
case Sema::TDK_Inconsistent:
|
|
case Sema::TDK_Inconsistent:
|
|
@@ -774,6 +779,7 @@ const TemplateArgument *DeductionFailureInfo::getSecondArg() {
|
|
case Sema::TDK_InvalidExplicitArguments:
|
|
case Sema::TDK_InvalidExplicitArguments:
|
|
case Sema::TDK_SubstitutionFailure:
|
|
case Sema::TDK_SubstitutionFailure:
|
|
case Sema::TDK_FailedOverloadResolution:
|
|
case Sema::TDK_FailedOverloadResolution:
|
|
|
|
+ case Sema::TDK_CUDATargetMismatch:
|
|
return nullptr;
|
|
return nullptr;
|
|
|
|
|
|
case Sema::TDK_Inconsistent:
|
|
case Sema::TDK_Inconsistent:
|
|
@@ -1139,20 +1145,11 @@ bool Sema::IsOverload(FunctionDecl *New, FunctionDecl *Old,
|
|
|
|
|
|
CUDAFunctionTarget NewTarget = IdentifyCUDATarget(New),
|
|
CUDAFunctionTarget NewTarget = IdentifyCUDATarget(New),
|
|
OldTarget = IdentifyCUDATarget(Old);
|
|
OldTarget = IdentifyCUDATarget(Old);
|
|
- if (NewTarget == CFT_InvalidTarget || NewTarget == CFT_Global)
|
|
|
|
|
|
+ if (NewTarget == CFT_InvalidTarget)
|
|
return false;
|
|
return false;
|
|
|
|
|
|
assert((OldTarget != CFT_InvalidTarget) && "Unexpected invalid target.");
|
|
assert((OldTarget != CFT_InvalidTarget) && "Unexpected invalid target.");
|
|
|
|
|
|
- // Don't allow HD and global functions to overload other functions with the
|
|
|
|
- // same signature. We allow overloading based on CUDA attributes so that
|
|
|
|
- // functions can have different implementations on the host and device, but
|
|
|
|
- // HD/global functions "exist" in some sense on both the host and device, so
|
|
|
|
- // should have the same implementation on both sides.
|
|
|
|
- if ((NewTarget == CFT_HostDevice) || (OldTarget == CFT_HostDevice) ||
|
|
|
|
- (NewTarget == CFT_Global) || (OldTarget == CFT_Global))
|
|
|
|
- return false;
|
|
|
|
-
|
|
|
|
// Allow overloading of functions with same signature and different CUDA
|
|
// Allow overloading of functions with same signature and different CUDA
|
|
// target attributes.
|
|
// target attributes.
|
|
return NewTarget != OldTarget;
|
|
return NewTarget != OldTarget;
|
|
@@ -9713,6 +9710,10 @@ static void DiagnoseBadDeduction(Sema &S, NamedDecl *Found, Decl *Templated,
|
|
S.Diag(Templated->getLocation(), diag::note_ovl_candidate_bad_deduction);
|
|
S.Diag(Templated->getLocation(), diag::note_ovl_candidate_bad_deduction);
|
|
MaybeEmitInheritedConstructorNote(S, Found);
|
|
MaybeEmitInheritedConstructorNote(S, Found);
|
|
return;
|
|
return;
|
|
|
|
+ case Sema::TDK_CUDATargetMismatch:
|
|
|
|
+ S.Diag(Templated->getLocation(),
|
|
|
|
+ diag::note_cuda_ovl_candidate_target_mismatch);
|
|
|
|
+ return;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
@@ -9969,6 +9970,7 @@ static unsigned RankDeductionFailure(const DeductionFailureInfo &DFI) {
|
|
case Sema::TDK_DeducedMismatch:
|
|
case Sema::TDK_DeducedMismatch:
|
|
case Sema::TDK_NonDeducedMismatch:
|
|
case Sema::TDK_NonDeducedMismatch:
|
|
case Sema::TDK_MiscellaneousDeductionFailure:
|
|
case Sema::TDK_MiscellaneousDeductionFailure:
|
|
|
|
+ case Sema::TDK_CUDATargetMismatch:
|
|
return 3;
|
|
return 3;
|
|
|
|
|
|
case Sema::TDK_InstantiationDepth:
|
|
case Sema::TDK_InstantiationDepth:
|