From: Benjamin Kramer Date: Thu, 12 Mar 2015 20:58:06 +0000 (+0000) Subject: Sema: Make BoundTypeDiagnoser a variadic template X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=4a57a4802365092aa90a79033f4f4a46f7ebeafb;p=clang Sema: Make BoundTypeDiagnoser a variadic template git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@232101 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/Sema/Sema.h b/include/clang/Sema/Sema.h index 9a5a408be8..ccb3452662 100644 --- a/include/clang/Sema/Sema.h +++ b/include/clang/Sema/Sema.h @@ -1250,62 +1250,29 @@ public: static SourceRange getPrintable(const Expr *E) { return E->getSourceRange(); } static SourceRange getPrintable(TypeLoc TL) { return TL.getSourceRange();} - template - class BoundTypeDiagnoser1 : public TypeDiagnoser { + template class BoundTypeDiagnoser : public TypeDiagnoser { unsigned DiagID; - const T1 &Arg1; - - public: - BoundTypeDiagnoser1(unsigned DiagID, const T1 &Arg1) - : TypeDiagnoser(DiagID == 0), DiagID(DiagID), Arg1(Arg1) { } - void diagnose(Sema &S, SourceLocation Loc, QualType T) override { - if (Suppressed) return; - S.Diag(Loc, DiagID) << getPrintable(Arg1) << T; + std::tuple Args; + + template + void emit(const SemaDiagnosticBuilder &DB, + llvm::index_sequence) const { + // Apply all tuple elements to the builder in order. + bool Dummy[] = {(DB << getPrintable(std::get(Args)))...}; + (void)Dummy; } - virtual ~BoundTypeDiagnoser1() { } - }; - - template - class BoundTypeDiagnoser2 : public TypeDiagnoser { - unsigned DiagID; - const T1 &Arg1; - const T2 &Arg2; - - public: - BoundTypeDiagnoser2(unsigned DiagID, const T1 &Arg1, - const T2 &Arg2) - : TypeDiagnoser(DiagID == 0), DiagID(DiagID), Arg1(Arg1), - Arg2(Arg2) { } - - void diagnose(Sema &S, SourceLocation Loc, QualType T) override { - if (Suppressed) return; - S.Diag(Loc, DiagID) << getPrintable(Arg1) << getPrintable(Arg2) << T; - } - - virtual ~BoundTypeDiagnoser2() { } - }; - - template - class BoundTypeDiagnoser3 : public TypeDiagnoser { - unsigned DiagID; - const T1 &Arg1; - const T2 &Arg2; - const T3 &Arg3; - public: - BoundTypeDiagnoser3(unsigned DiagID, const T1 &Arg1, - const T2 &Arg2, const T3 &Arg3) - : TypeDiagnoser(DiagID == 0), DiagID(DiagID), Arg1(Arg1), - Arg2(Arg2), Arg3(Arg3) { } + BoundTypeDiagnoser(unsigned DiagID, const Ts &...Args) + : TypeDiagnoser(DiagID == 0), DiagID(DiagID), Args(Args...) {} void diagnose(Sema &S, SourceLocation Loc, QualType T) override { - if (Suppressed) return; - S.Diag(Loc, DiagID) - << getPrintable(Arg1) << getPrintable(Arg2) << getPrintable(Arg3) << T; + if (Suppressed) + return; + const SemaDiagnosticBuilder &DB = S.Diag(Loc, DiagID); + emit(DB, llvm::index_sequence_for()); + DB << T; } - - virtual ~BoundTypeDiagnoser3() { } }; private: @@ -1317,50 +1284,19 @@ public: bool RequireCompleteType(SourceLocation Loc, QualType T, unsigned DiagID); - template - bool RequireCompleteType(SourceLocation Loc, QualType T, - unsigned DiagID, const T1 &Arg1) { - BoundTypeDiagnoser1 Diagnoser(DiagID, Arg1); - return RequireCompleteType(Loc, T, Diagnoser); - } - - template - bool RequireCompleteType(SourceLocation Loc, QualType T, - unsigned DiagID, const T1 &Arg1, const T2 &Arg2) { - BoundTypeDiagnoser2 Diagnoser(DiagID, Arg1, Arg2); - return RequireCompleteType(Loc, T, Diagnoser); - } - - template - bool RequireCompleteType(SourceLocation Loc, QualType T, - unsigned DiagID, const T1 &Arg1, const T2 &Arg2, - const T3 &Arg3) { - BoundTypeDiagnoser3 Diagnoser(DiagID, Arg1, Arg2, - Arg3); + template + bool RequireCompleteType(SourceLocation Loc, QualType T, unsigned DiagID, + const Ts &...Args) { + BoundTypeDiagnoser Diagnoser(DiagID, Args...); return RequireCompleteType(Loc, T, Diagnoser); } bool RequireCompleteExprType(Expr *E, TypeDiagnoser &Diagnoser); bool RequireCompleteExprType(Expr *E, unsigned DiagID); - template - bool RequireCompleteExprType(Expr *E, unsigned DiagID, const T1 &Arg1) { - BoundTypeDiagnoser1 Diagnoser(DiagID, Arg1); - return RequireCompleteExprType(E, Diagnoser); - } - - template - bool RequireCompleteExprType(Expr *E, unsigned DiagID, const T1 &Arg1, - const T2 &Arg2) { - BoundTypeDiagnoser2 Diagnoser(DiagID, Arg1, Arg2); - return RequireCompleteExprType(E, Diagnoser); - } - - template - bool RequireCompleteExprType(Expr *E, unsigned DiagID, const T1 &Arg1, - const T2 &Arg2, const T3 &Arg3) { - BoundTypeDiagnoser3 Diagnoser(DiagID, Arg1, Arg2, - Arg3); + template + bool RequireCompleteExprType(Expr *E, unsigned DiagID, const Ts &...Args) { + BoundTypeDiagnoser Diagnoser(DiagID, Args...); return RequireCompleteExprType(E, Diagnoser); } @@ -1368,26 +1304,10 @@ public: TypeDiagnoser &Diagnoser); bool RequireLiteralType(SourceLocation Loc, QualType T, unsigned DiagID); - template - bool RequireLiteralType(SourceLocation Loc, QualType T, - unsigned DiagID, const T1 &Arg1) { - BoundTypeDiagnoser1 Diagnoser(DiagID, Arg1); - return RequireLiteralType(Loc, T, Diagnoser); - } - - template - bool RequireLiteralType(SourceLocation Loc, QualType T, - unsigned DiagID, const T1 &Arg1, const T2 &Arg2) { - BoundTypeDiagnoser2 Diagnoser(DiagID, Arg1, Arg2); - return RequireLiteralType(Loc, T, Diagnoser); - } - - template - bool RequireLiteralType(SourceLocation Loc, QualType T, - unsigned DiagID, const T1 &Arg1, const T2 &Arg2, - const T3 &Arg3) { - BoundTypeDiagnoser3 Diagnoser(DiagID, Arg1, Arg2, - Arg3); + template + bool RequireLiteralType(SourceLocation Loc, QualType T, unsigned DiagID, + const Ts &...Args) { + BoundTypeDiagnoser Diagnoser(DiagID, Args...); return RequireLiteralType(Loc, T, Diagnoser); } @@ -5296,27 +5216,10 @@ public: bool RequireNonAbstractType(SourceLocation Loc, QualType T, TypeDiagnoser &Diagnoser); - template - bool RequireNonAbstractType(SourceLocation Loc, QualType T, - unsigned DiagID, - const T1 &Arg1) { - BoundTypeDiagnoser1 Diagnoser(DiagID, Arg1); - return RequireNonAbstractType(Loc, T, Diagnoser); - } - - template - bool RequireNonAbstractType(SourceLocation Loc, QualType T, - unsigned DiagID, - const T1 &Arg1, const T2 &Arg2) { - BoundTypeDiagnoser2 Diagnoser(DiagID, Arg1, Arg2); - return RequireNonAbstractType(Loc, T, Diagnoser); - } - - template - bool RequireNonAbstractType(SourceLocation Loc, QualType T, - unsigned DiagID, - const T1 &Arg1, const T2 &Arg2, const T3 &Arg3) { - BoundTypeDiagnoser3 Diagnoser(DiagID, Arg1, Arg2, Arg3); + template + bool RequireNonAbstractType(SourceLocation Loc, QualType T, unsigned DiagID, + const Ts &...Args) { + BoundTypeDiagnoser Diagnoser(DiagID, Args...); return RequireNonAbstractType(Loc, T, Diagnoser); }