Skip to content

Commit ae29842

Browse files
committed
Move Sema::RequireNonAbstractType() off of PartialDiagnostic.
llvm-svn: 156180
1 parent a6c5abb commit ae29842

File tree

4 files changed

+50
-14
lines changed

4 files changed

+50
-14
lines changed

clang/include/clang/Sema/Sema.h

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4423,7 +4423,31 @@ class Sema {
44234423
};
44244424

44254425
bool RequireNonAbstractType(SourceLocation Loc, QualType T,
4426-
const PartialDiagnostic &PD);
4426+
TypeDiagnoser &Diagnoser);
4427+
template<typename T1>
4428+
bool RequireNonAbstractType(SourceLocation Loc, QualType T,
4429+
unsigned DiagID,
4430+
const T1 &Arg1) {
4431+
BoundTypeDiagnoser1<T1> Diagnoser(DiagID, Arg1);
4432+
return RequireNonAbstractType(Loc, T, Diagnoser);
4433+
}
4434+
4435+
template<typename T1, typename T2>
4436+
bool RequireNonAbstractType(SourceLocation Loc, QualType T,
4437+
unsigned DiagID,
4438+
const T1 &Arg1, const T2 &Arg2) {
4439+
BoundTypeDiagnoser2<T1, T2> Diagnoser(DiagID, Arg1, Arg2);
4440+
return RequireNonAbstractType(Loc, T, Diagnoser);
4441+
}
4442+
4443+
template<typename T1, typename T2, typename T3>
4444+
bool RequireNonAbstractType(SourceLocation Loc, QualType T,
4445+
unsigned DiagID,
4446+
const T1 &Arg1, const T2 &Arg2, const T3 &Arg3) {
4447+
BoundTypeDiagnoser3<T1, T2, T3> Diagnoser(DiagID, Arg1, Arg2, Arg3);
4448+
return RequireNonAbstractType(Loc, T, Diagnoser);
4449+
}
4450+
44274451
void DiagnoseAbstractType(const CXXRecordDecl *RD);
44284452

44294453
bool RequireNonAbstractType(SourceLocation Loc, QualType T, unsigned DiagID,

clang/lib/Sema/SemaDeclCXX.cpp

Lines changed: 21 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3396,27 +3396,40 @@ void Sema::ActOnDefaultCtorInitializers(Decl *CDtorDecl) {
33963396

33973397
bool Sema::RequireNonAbstractType(SourceLocation Loc, QualType T,
33983398
unsigned DiagID, AbstractDiagSelID SelID) {
3399-
if (SelID == -1)
3400-
return RequireNonAbstractType(Loc, T, PDiag(DiagID));
3401-
else
3402-
return RequireNonAbstractType(Loc, T, PDiag(DiagID) << SelID);
3399+
class NonAbstractTypeDiagnoser : public TypeDiagnoser {
3400+
unsigned DiagID;
3401+
AbstractDiagSelID SelID;
3402+
3403+
public:
3404+
NonAbstractTypeDiagnoser(unsigned DiagID, AbstractDiagSelID SelID)
3405+
: TypeDiagnoser(DiagID == 0), DiagID(DiagID), SelID(SelID) { }
3406+
3407+
virtual void diagnose(Sema &S, SourceLocation Loc, QualType T) {
3408+
if (SelID == -1)
3409+
S.Diag(Loc, DiagID) << T;
3410+
else
3411+
S.Diag(Loc, DiagID) << SelID << T;
3412+
}
3413+
} Diagnoser(DiagID, SelID);
3414+
3415+
return RequireNonAbstractType(Loc, T, Diagnoser);
34033416
}
34043417

34053418
bool Sema::RequireNonAbstractType(SourceLocation Loc, QualType T,
3406-
const PartialDiagnostic &PD) {
3419+
TypeDiagnoser &Diagnoser) {
34073420
if (!getLangOpts().CPlusPlus)
34083421
return false;
34093422

34103423
if (const ArrayType *AT = Context.getAsArrayType(T))
3411-
return RequireNonAbstractType(Loc, AT->getElementType(), PD);
3424+
return RequireNonAbstractType(Loc, AT->getElementType(), Diagnoser);
34123425

34133426
if (const PointerType *PT = T->getAs<PointerType>()) {
34143427
// Find the innermost pointer type.
34153428
while (const PointerType *T = PT->getPointeeType()->getAs<PointerType>())
34163429
PT = T;
34173430

34183431
if (const ArrayType *AT = Context.getAsArrayType(PT->getPointeeType()))
3419-
return RequireNonAbstractType(Loc, AT->getElementType(), PD);
3432+
return RequireNonAbstractType(Loc, AT->getElementType(), Diagnoser);
34203433
}
34213434

34223435
const RecordType *RT = T->getAs<RecordType>();
@@ -3435,7 +3448,7 @@ bool Sema::RequireNonAbstractType(SourceLocation Loc, QualType T,
34353448
if (!RD->isAbstract())
34363449
return false;
34373450

3438-
Diag(Loc, PD) << RD->getDeclName();
3451+
Diagnoser.diagnose(*this, Loc, T);
34393452
DiagnoseAbstractType(RD);
34403453

34413454
return true;

clang/lib/Sema/SemaExpr.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9205,9 +9205,9 @@ ExprResult Sema::BuildVAArgExpr(SourceLocation BuiltinLoc,
92059205
return ExprError();
92069206

92079207
if (RequireNonAbstractType(TInfo->getTypeLoc().getBeginLoc(),
9208-
TInfo->getType(),
9209-
PDiag(diag::err_second_parameter_to_va_arg_abstract)
9210-
<< TInfo->getTypeLoc().getSourceRange()))
9208+
TInfo->getType(),
9209+
diag::err_second_parameter_to_va_arg_abstract,
9210+
TInfo->getTypeLoc()))
92119211
return ExprError();
92129212

92139213
if (!TInfo->getType().isPODType(Context)) {

clang/lib/Sema/SemaExprCXX.cpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -590,8 +590,7 @@ ExprResult Sema::CheckCXXThrowOperand(SourceLocation ThrowLoc, Expr *E,
590590
return ExprError();
591591

592592
if (RequireNonAbstractType(ThrowLoc, E->getType(),
593-
PDiag(diag::err_throw_abstract_type)
594-
<< E->getSourceRange()))
593+
diag::err_throw_abstract_type, E))
595594
return ExprError();
596595
}
597596

0 commit comments

Comments
 (0)