[AMD Public Use] It was reverted because it caused regressions in some CUDA apps.
Is there a way for me to modify the commit message? Thanks. Sam -----Original Message----- From: Roman Lebedev <lebedev...@gmail.com> Sent: Thursday, September 17, 2020 2:14 PM To: Liu, Yaxun (Sam) <yaxun....@amd.com>; Yaxun Liu <llvmlist...@llvm.org> Cc: cfe-commits@lists.llvm.org Subject: Re: [clang] 829d14e - Revert "[NFC] Refactor DiagnosticBuilder and PartialDiagnostic" [CAUTION: External Email] On Thu, Sep 17, 2020 at 8:57 PM Yaxun Liu via cfe-commits <cfe-commits@lists.llvm.org> wrote: > > > Author: Yaxun (Sam) Liu > Date: 2020-09-17T13:56:09-04:00 > New Revision: 829d14ee0a6aa79c89f7f3d9fcd9d27d3efd2b91 > > URL: > https://nam11.safelinks.protection.outlook.com/?url=https%3A%2F%2Fgith > ub.com%2Fllvm%2Fllvm-project%2Fcommit%2F829d14ee0a6aa79c89f7f3d9fcd9d2 > 7d3efd2b91&data=02%7C01%7Cyaxun.liu%40amd.com%7C1165c7b467ad471f37 > 1b08d85b358dcf%7C3dd8961fe4884e608e11a82d994e183d%7C0%7C0%7C6373596328 > 68922532&sdata=ngtA%2BYzoY8lfE1krECrmAw%2FXPytw2f8Nz%2FIqoyccX14%3 > D&reserved=0 > DIFF: > https://nam11.safelinks.protection.outlook.com/?url=https%3A%2F%2Fgith > ub.com%2Fllvm%2Fllvm-project%2Fcommit%2F829d14ee0a6aa79c89f7f3d9fcd9d2 > 7d3efd2b91.diff&data=02%7C01%7Cyaxun.liu%40amd.com%7C1165c7b467ad4 > 71f371b08d85b358dcf%7C3dd8961fe4884e608e11a82d994e183d%7C0%7C0%7C63735 > 9632868922532&sdata=sJJczip6ORLkxglLBk48QiHbZkyrZ1uiKupti6H2ZPE%3D > &reserved=0 > > LOG: Revert "[NFC] Refactor DiagnosticBuilder and PartialDiagnostic" > > This reverts commit ee5519d323571c4a9a7d92cb817023c9b95334cd. It is a really good idea for a commit message to actually explain what the commit does, not just state what it is. > Added: > > > Modified: > clang/include/clang/AST/ASTContext.h > clang/include/clang/AST/Attr.h > clang/include/clang/AST/CanonicalType.h > clang/include/clang/AST/Decl.h > clang/include/clang/AST/DeclCXX.h > clang/include/clang/AST/DeclarationName.h > clang/include/clang/AST/NestedNameSpecifier.h > clang/include/clang/AST/TemplateBase.h > clang/include/clang/AST/TemplateName.h > clang/include/clang/AST/Type.h > clang/include/clang/Basic/Diagnostic.h > clang/include/clang/Basic/PartialDiagnostic.h > clang/include/clang/Sema/Ownership.h > clang/include/clang/Sema/ParsedAttr.h > clang/include/clang/Sema/Sema.h > clang/lib/AST/ASTContext.cpp > clang/lib/AST/DeclCXX.cpp > clang/lib/AST/TemplateBase.cpp > clang/lib/AST/TemplateName.cpp > clang/lib/Basic/Diagnostic.cpp > > Removed: > > > > ###################################################################### > ########## diff --git a/clang/include/clang/AST/ASTContext.h > b/clang/include/clang/AST/ASTContext.h > index 397fee4d866b..de0d1198b6d4 100644 > --- a/clang/include/clang/AST/ASTContext.h > +++ b/clang/include/clang/AST/ASTContext.h > @@ -3064,9 +3064,8 @@ OPT_LIST(V) > }; > > /// Insertion operator for diagnostics. > -const StreamableDiagnosticBase & > -operator<<(const StreamableDiagnosticBase &DB, > - const ASTContext::SectionInfo &Section); > +const DiagnosticBuilder &operator<<(const DiagnosticBuilder &DB, > + const ASTContext::SectionInfo > +&Section); > > /// Utility function for constructing a nullary selector. > inline Selector GetNullarySelector(StringRef name, ASTContext &Ctx) { > > diff --git a/clang/include/clang/AST/Attr.h > b/clang/include/clang/AST/Attr.h index b4dce8f41c67..b3729b2e0d99 > 100644 > --- a/clang/include/clang/AST/Attr.h > +++ b/clang/include/clang/AST/Attr.h > @@ -350,12 +350,19 @@ struct ParsedTargetAttr { > > #include "clang/AST/Attrs.inc" > > -inline const StreamableDiagnosticBase & -operator<<(const > StreamableDiagnosticBase &DB, const Attr *At) { > +inline const DiagnosticBuilder &operator<<(const DiagnosticBuilder &DB, > + const Attr *At) { > DB.AddTaggedVal(reinterpret_cast<intptr_t>(At), > DiagnosticsEngine::ak_attr); > return DB; > } > + > +inline const PartialDiagnostic &operator<<(const PartialDiagnostic &PD, > + const Attr *At) { > + PD.AddTaggedVal(reinterpret_cast<intptr_t>(At), > + DiagnosticsEngine::ak_attr); > + return PD; > +} > } // end namespace clang > > #endif > > diff --git a/clang/include/clang/AST/CanonicalType.h > b/clang/include/clang/AST/CanonicalType.h > index b6d9b69db09a..488284713bce 100644 > --- a/clang/include/clang/AST/CanonicalType.h > +++ b/clang/include/clang/AST/CanonicalType.h > @@ -215,8 +215,8 @@ inline CanQualType Type::getCanonicalTypeUnqualified() > const { > return CanQualType::CreateUnsafe(getCanonicalTypeInternal()); > } > > -inline const StreamableDiagnosticBase & -operator<<(const > StreamableDiagnosticBase &DB, CanQualType T) { > +inline const DiagnosticBuilder &operator<<(const DiagnosticBuilder &DB, > + CanQualType T) { > DB << static_cast<QualType>(T); > return DB; > } > > diff --git a/clang/include/clang/AST/Decl.h > b/clang/include/clang/AST/Decl.h index 852ba2316f82..c2511514fe72 > 100644 > --- a/clang/include/clang/AST/Decl.h > +++ b/clang/include/clang/AST/Decl.h > @@ -4513,8 +4513,14 @@ class EmptyDecl : public Decl { > > /// Insertion operator for diagnostics. This allows sending > NamedDecl's /// into a diagnostic with <<. > -inline const StreamableDiagnosticBase & -operator<<(const > StreamableDiagnosticBase &PD, const NamedDecl *ND) { > +inline const DiagnosticBuilder &operator<<(const DiagnosticBuilder &DB, > + const NamedDecl* ND) { > + DB.AddTaggedVal(reinterpret_cast<intptr_t>(ND), > + DiagnosticsEngine::ak_nameddecl); > + return DB; > +} > +inline const PartialDiagnostic &operator<<(const PartialDiagnostic &PD, > + const NamedDecl* ND) { > PD.AddTaggedVal(reinterpret_cast<intptr_t>(ND), > DiagnosticsEngine::ak_nameddecl); > return PD; > > diff --git a/clang/include/clang/AST/DeclCXX.h > b/clang/include/clang/AST/DeclCXX.h > index 065a7413e7e7..20f058b87e7f 100644 > --- a/clang/include/clang/AST/DeclCXX.h > +++ b/clang/include/clang/AST/DeclCXX.h > @@ -4070,8 +4070,11 @@ class MSGuidDecl : public ValueDecl, > > /// Insertion operator for diagnostics. This allows sending an > AccessSpecifier /// into a diagnostic with <<. > -const StreamableDiagnosticBase &operator<<(const StreamableDiagnosticBase > &DB, > - AccessSpecifier AS); > +const DiagnosticBuilder &operator<<(const DiagnosticBuilder &DB, > + AccessSpecifier AS); > + > +const PartialDiagnostic &operator<<(const PartialDiagnostic &DB, > + AccessSpecifier AS); > > } // namespace clang > > > diff --git a/clang/include/clang/AST/DeclarationName.h > b/clang/include/clang/AST/DeclarationName.h > index b5692ec7684b..a037e8b197bc 100644 > --- a/clang/include/clang/AST/DeclarationName.h > +++ b/clang/include/clang/AST/DeclarationName.h > @@ -811,10 +811,19 @@ struct DeclarationNameInfo { > SourceLocation getEndLocPrivate() const; }; > > +/// Insertion operator for diagnostics. This allows sending > +DeclarationName's /// into a diagnostic with <<. > +inline const DiagnosticBuilder &operator<<(const DiagnosticBuilder &DB, > + DeclarationName N) { > + DB.AddTaggedVal(N.getAsOpaqueInteger(), > + DiagnosticsEngine::ak_declarationname); > + return DB; > +} > + > /// Insertion operator for partial diagnostics. This allows binding > /// DeclarationName's into a partial diagnostic with <<. > -inline const StreamableDiagnosticBase & -operator<<(const > StreamableDiagnosticBase &PD, DeclarationName N) { > +inline const PartialDiagnostic &operator<<(const PartialDiagnostic &PD, > + DeclarationName N) { > PD.AddTaggedVal(N.getAsOpaqueInteger(), > DiagnosticsEngine::ak_declarationname); > return PD; > > diff --git a/clang/include/clang/AST/NestedNameSpecifier.h > b/clang/include/clang/AST/NestedNameSpecifier.h > index 70edcfe70423..b11cb5f6b86d 100644 > --- a/clang/include/clang/AST/NestedNameSpecifier.h > +++ b/clang/include/clang/AST/NestedNameSpecifier.h > @@ -519,8 +519,8 @@ class NestedNameSpecifierLocBuilder { > > /// Insertion operator for diagnostics. This allows sending /// > NestedNameSpecifiers into a diagnostic with <<. > -inline const StreamableDiagnosticBase & -operator<<(const > StreamableDiagnosticBase &DB, NestedNameSpecifier *NNS) { > +inline const DiagnosticBuilder &operator<<(const DiagnosticBuilder &DB, > + NestedNameSpecifier *NNS) > +{ > DB.AddTaggedVal(reinterpret_cast<intptr_t>(NNS), > DiagnosticsEngine::ak_nestednamespec); > return DB; > > diff --git a/clang/include/clang/AST/TemplateBase.h > b/clang/include/clang/AST/TemplateBase.h > index 5abf60cab4a4..51fd8ba51034 100644 > --- a/clang/include/clang/AST/TemplateBase.h > +++ b/clang/include/clang/AST/TemplateBase.h > @@ -681,8 +681,8 @@ struct alignas(void *) ASTTemplateKWAndArgsInfo { > TemplateArgumentListInfo &List) const; }; > > -const StreamableDiagnosticBase &operator<<(const StreamableDiagnosticBase > &DB, > - const TemplateArgument &Arg); > +const DiagnosticBuilder &operator<<(const DiagnosticBuilder &DB, > + const TemplateArgument &Arg); > > inline TemplateSpecializationType::iterator > TemplateSpecializationType::end() const { > > diff --git a/clang/include/clang/AST/TemplateName.h > b/clang/include/clang/AST/TemplateName.h > index 0f78d7976a46..9bcf2838dcf1 100644 > --- a/clang/include/clang/AST/TemplateName.h > +++ b/clang/include/clang/AST/TemplateName.h > @@ -342,8 +342,10 @@ class TemplateName { > > /// Insertion operator for diagnostics. This allows sending > TemplateName's /// into a diagnostic with <<. > -const StreamableDiagnosticBase &operator<<(const StreamableDiagnosticBase > &DB, > - TemplateName N); > +const DiagnosticBuilder &operator<<(const DiagnosticBuilder &DB, > + TemplateName N); const > +PartialDiagnostic &operator<<(const PartialDiagnostic &PD, > + TemplateName N); > > /// A structure for storing the information associated with a /// > substituted template template parameter. > > diff --git a/clang/include/clang/AST/Type.h > b/clang/include/clang/AST/Type.h index 2bf17b6d7ab0..d8eece10475a > 100644 > --- a/clang/include/clang/AST/Type.h > +++ b/clang/include/clang/AST/Type.h > @@ -7068,28 +7068,55 @@ inline const Type > *Type::getPointeeOrArrayElementType() const { > return type->getBaseElementTypeUnsafe(); > return type; > } > +/// Insertion operator for diagnostics. This allows sending address > +spaces into /// a diagnostic with <<. > +inline const DiagnosticBuilder &operator<<(const DiagnosticBuilder &DB, > + LangAS AS) { > + DB.AddTaggedVal(static_cast<std::underlying_type_t<LangAS>>(AS), > + DiagnosticsEngine::ArgumentKind::ak_addrspace); > + return DB; > +} > + > /// Insertion operator for partial diagnostics. This allows sending > adress /// spaces into a diagnostic with <<. > -inline const StreamableDiagnosticBase & -operator<<(const > StreamableDiagnosticBase &PD, LangAS AS) { > +inline const PartialDiagnostic &operator<<(const PartialDiagnostic &PD, > + LangAS AS) { > PD.AddTaggedVal(static_cast<std::underlying_type_t<LangAS>>(AS), > DiagnosticsEngine::ArgumentKind::ak_addrspace); > return PD; > } > > +/// Insertion operator for diagnostics. This allows sending > +Qualifiers into a /// diagnostic with <<. > +inline const DiagnosticBuilder &operator<<(const DiagnosticBuilder &DB, > + Qualifiers Q) { > + DB.AddTaggedVal(Q.getAsOpaqueValue(), > + DiagnosticsEngine::ArgumentKind::ak_qual); > + return DB; > +} > + > /// Insertion operator for partial diagnostics. This allows sending > Qualifiers /// into a diagnostic with <<. > -inline const StreamableDiagnosticBase & -operator<<(const > StreamableDiagnosticBase &PD, Qualifiers Q) { > +inline const PartialDiagnostic &operator<<(const PartialDiagnostic &PD, > + Qualifiers Q) { > PD.AddTaggedVal(Q.getAsOpaqueValue(), > DiagnosticsEngine::ArgumentKind::ak_qual); > return PD; > } > > +/// Insertion operator for diagnostics. This allows sending > +QualType's into a /// diagnostic with <<. > +inline const DiagnosticBuilder &operator<<(const DiagnosticBuilder &DB, > + QualType T) { > + DB.AddTaggedVal(reinterpret_cast<intptr_t>(T.getAsOpaquePtr()), > + DiagnosticsEngine::ak_qualtype); > + return DB; > +} > + > /// Insertion operator for partial diagnostics. This allows sending > QualType's /// into a diagnostic with <<. > -inline const StreamableDiagnosticBase & -operator<<(const > StreamableDiagnosticBase &PD, QualType T) { > +inline const PartialDiagnostic &operator<<(const PartialDiagnostic &PD, > + QualType T) { > PD.AddTaggedVal(reinterpret_cast<intptr_t>(T.getAsOpaquePtr()), > DiagnosticsEngine::ak_qualtype); > return PD; > > diff --git a/clang/include/clang/Basic/Diagnostic.h > b/clang/include/clang/Basic/Diagnostic.h > index 7ce418bbb996..304207779c0f 100644 > --- a/clang/include/clang/Basic/Diagnostic.h > +++ b/clang/include/clang/Basic/Diagnostic.h > @@ -1043,35 +1043,6 @@ class DiagnosticErrorTrap { > } > }; > > -/// The streaming interface shared between DiagnosticBuilder and -/// > PartialDiagnostic. > -/// > -/// Any new type of argument accepted by DiagnosticBuilder and > PartialDiagnostic -/// should be implemented as a '<<' operator of > StreamableDiagnosticBase, e.g. > -/// > -/// const StreamableDiagnosticBase& > -/// operator<<(const StreamableDiagnosticBase&, NewArgType); -/// > -class StreamableDiagnosticBase { > -public: > - virtual void AddString(StringRef S) const = 0; > - virtual void AddTaggedVal(intptr_t V, > - DiagnosticsEngine::ArgumentKind Kind) const = 0; > - virtual void AddSourceRange(const CharSourceRange &R) const = 0; > - virtual void AddFixItHint(const FixItHint &Hint) const = 0; > - > - /// Conversion of StreamableDiagnosticBase to bool always returns \c true. > - /// > - /// This allows is to be used in boolean error contexts (where \c > true is > - /// used to indicate that an error has occurred), like: > - /// \code > - /// return Diag(...); > - /// \endcode > - operator bool() const { return true; } > - > - virtual ~StreamableDiagnosticBase() {} -}; > - > > //===----------------------------------------------------------------- > -----===// > // DiagnosticBuilder > > //===----------------------------------------------------------------- > -----===// @@ -1088,7 +1059,7 @@ class StreamableDiagnosticBase { /// > This ensures that compilers with somewhat reasonable optimizers will > promote /// the common fields to registers, eliminating increments of > the NumArgs field, /// for example. > -class DiagnosticBuilder : public StreamableDiagnosticBase { > +class DiagnosticBuilder { > friend class DiagnosticsEngine; > friend class PartialDiagnostic; > > @@ -1166,27 +1137,12 @@ class DiagnosticBuilder : public > StreamableDiagnosticBase { > NumArgs = D.NumArgs; > } > > - template <typename T> const DiagnosticBuilder &operator<<(const T &V) > const { > - const StreamableDiagnosticBase &DB = *this; > - DB << V; > - return *this; > - } > - > - // It is necessary to limit this to rvalue reference to avoid > calling this > - // function with a bitfield lvalue argument since non-const > reference to > - // bitfield is not allowed. > - template <typename T, typename = typename std::enable_if< > - !std::is_lvalue_reference<T>::value>::type> > - const DiagnosticBuilder &operator<<(T &&V) const { > - const StreamableDiagnosticBase &DB = *this; > - DB << std::move(V); > - return *this; > - } > - > DiagnosticBuilder &operator=(const DiagnosticBuilder &) = delete; > > /// Emits the diagnostic. > - virtual ~DiagnosticBuilder() { Emit(); } > + ~DiagnosticBuilder() { > + Emit(); > + } > > /// Forces the diagnostic to be emitted. > const DiagnosticBuilder &setForceEmit() const { @@ -1194,7 +1150,16 > @@ class DiagnosticBuilder : public StreamableDiagnosticBase { > return *this; > } > > - void AddString(StringRef S) const override { > + /// Conversion of DiagnosticBuilder to bool always returns \c true. > + /// > + /// This allows is to be used in boolean error contexts (where \c > + true is /// used to indicate that an error has occurred), like: > + /// \code > + /// return Diag(...); > + /// \endcode > + operator bool() const { return true; } > + > + void AddString(StringRef S) const { > assert(isActive() && "Clients must not add to cleared diagnostic!"); > assert(NumArgs < DiagnosticsEngine::MaxArguments && > "Too many arguments to diagnostic!"); @@ -1202,8 +1167,7 > @@ class DiagnosticBuilder : public StreamableDiagnosticBase { > DiagObj->DiagArgumentsStr[NumArgs++] = std::string(S); > } > > - void AddTaggedVal(intptr_t V, > - DiagnosticsEngine::ArgumentKind Kind) const override { > + void AddTaggedVal(intptr_t V, DiagnosticsEngine::ArgumentKind Kind) > + const { > assert(isActive() && "Clients must not add to cleared diagnostic!"); > assert(NumArgs < DiagnosticsEngine::MaxArguments && > "Too many arguments to diagnostic!"); @@ -1211,12 +1175,12 > @@ class DiagnosticBuilder : public StreamableDiagnosticBase { > DiagObj->DiagArgumentsVal[NumArgs++] = V; > } > > - void AddSourceRange(const CharSourceRange &R) const override { > + void AddSourceRange(const CharSourceRange &R) const { > assert(isActive() && "Clients must not add to cleared diagnostic!"); > DiagObj->DiagRanges.push_back(R); > } > > - void AddFixItHint(const FixItHint &Hint) const override { > + void AddFixItHint(const FixItHint &Hint) const { > assert(isActive() && "Clients must not add to cleared diagnostic!"); > if (!Hint.isNull()) > DiagObj->DiagFixItHints.push_back(Hint); > @@ -1241,21 +1205,20 @@ inline const DiagnosticBuilder &operator<<(const > DiagnosticBuilder &DB, > return DB; > } > > -inline const StreamableDiagnosticBase & -operator<<(const > StreamableDiagnosticBase &DB, StringRef S) { > +inline const DiagnosticBuilder &operator<<(const DiagnosticBuilder &DB, > + StringRef S) { > DB.AddString(S); > return DB; > } > > -inline const StreamableDiagnosticBase & -operator<<(const > StreamableDiagnosticBase &DB, const char *Str) { > +inline const DiagnosticBuilder &operator<<(const DiagnosticBuilder &DB, > + const char *Str) { > DB.AddTaggedVal(reinterpret_cast<intptr_t>(Str), > DiagnosticsEngine::ak_c_string); > return DB; > } > > -inline const StreamableDiagnosticBase & -operator<<(const > StreamableDiagnosticBase &DB, int I) { > +inline const DiagnosticBuilder &operator<<(const DiagnosticBuilder > +&DB, int I) { > DB.AddTaggedVal(I, DiagnosticsEngine::ak_sint); > return DB; > } > @@ -1263,27 +1226,26 @@ operator<<(const StreamableDiagnosticBase &DB, > int I) { // We use enable_if here to prevent that this overload is > selected for // pointers or other arguments that are implicitly convertible > to bool. > template <typename T> > -inline std::enable_if_t<std::is_same<T, bool>::value, > - const StreamableDiagnosticBase &> > -operator<<(const StreamableDiagnosticBase &DB, T I) { > +inline std::enable_if_t<std::is_same<T, bool>::value, const > +DiagnosticBuilder &> operator<<(const DiagnosticBuilder &DB, T I) { > DB.AddTaggedVal(I, DiagnosticsEngine::ak_sint); > return DB; > } > > -inline const StreamableDiagnosticBase & -operator<<(const > StreamableDiagnosticBase &DB, unsigned I) { > +inline const DiagnosticBuilder &operator<<(const DiagnosticBuilder &DB, > + unsigned I) { > DB.AddTaggedVal(I, DiagnosticsEngine::ak_uint); > return DB; > } > > -inline const StreamableDiagnosticBase & -operator<<(const > StreamableDiagnosticBase &DB, tok::TokenKind I) { > +inline const DiagnosticBuilder &operator<<(const DiagnosticBuilder &DB, > + tok::TokenKind I) { > DB.AddTaggedVal(static_cast<unsigned>(I), DiagnosticsEngine::ak_tokenkind); > return DB; > } > > -inline const StreamableDiagnosticBase & -operator<<(const > StreamableDiagnosticBase &DB, const IdentifierInfo *II) { > +inline const DiagnosticBuilder &operator<<(const DiagnosticBuilder &DB, > + const IdentifierInfo *II) > +{ > DB.AddTaggedVal(reinterpret_cast<intptr_t>(II), > DiagnosticsEngine::ak_identifierinfo); > return DB; > @@ -1296,64 +1258,63 @@ operator<<(const StreamableDiagnosticBase &DB, > const IdentifierInfo *II) { template <typename T> inline > std::enable_if_t< > std::is_same<std::remove_const_t<T>, DeclContext>::value, > - const StreamableDiagnosticBase &> > -operator<<(const StreamableDiagnosticBase &DB, T *DC) { > + const DiagnosticBuilder &> > +operator<<(const DiagnosticBuilder &DB, T *DC) { > DB.AddTaggedVal(reinterpret_cast<intptr_t>(DC), > DiagnosticsEngine::ak_declcontext); > return DB; > } > > -inline const StreamableDiagnosticBase & -operator<<(const > StreamableDiagnosticBase &DB, SourceRange R) { > +inline const DiagnosticBuilder &operator<<(const DiagnosticBuilder &DB, > + SourceRange R) { > DB.AddSourceRange(CharSourceRange::getTokenRange(R)); > return DB; > } > > -inline const StreamableDiagnosticBase & -operator<<(const > StreamableDiagnosticBase &DB, ArrayRef<SourceRange> Ranges) { > +inline const DiagnosticBuilder &operator<<(const DiagnosticBuilder &DB, > + ArrayRef<SourceRange> > +Ranges) { > for (SourceRange R : Ranges) > DB.AddSourceRange(CharSourceRange::getTokenRange(R)); > return DB; > } > > -inline const StreamableDiagnosticBase & -operator<<(const > StreamableDiagnosticBase &DB, const CharSourceRange &R) { > +inline const DiagnosticBuilder &operator<<(const DiagnosticBuilder &DB, > + const CharSourceRange &R) > +{ > DB.AddSourceRange(R); > return DB; > } > > -inline const StreamableDiagnosticBase & -operator<<(const > StreamableDiagnosticBase &DB, const FixItHint &Hint) { > +inline const DiagnosticBuilder &operator<<(const DiagnosticBuilder &DB, > + const FixItHint &Hint) { > DB.AddFixItHint(Hint); > return DB; > } > > -inline const StreamableDiagnosticBase & -operator<<(const > StreamableDiagnosticBase &DB, ArrayRef<FixItHint> Hints) { > +inline const DiagnosticBuilder &operator<<(const DiagnosticBuilder &DB, > + ArrayRef<FixItHint> Hints) > +{ > for (const FixItHint &Hint : Hints) > DB.AddFixItHint(Hint); > return DB; > } > > -inline const StreamableDiagnosticBase & -operator<<(const > StreamableDiagnosticBase &DB, > +inline const DiagnosticBuilder & > +operator<<(const DiagnosticBuilder &DB, > const llvm::Optional<SourceRange> &Opt) { > if (Opt) > DB << *Opt; > return DB; > } > > -inline const StreamableDiagnosticBase & -operator<<(const > StreamableDiagnosticBase &DB, > +inline const DiagnosticBuilder & > +operator<<(const DiagnosticBuilder &DB, > const llvm::Optional<CharSourceRange> &Opt) { > if (Opt) > DB << *Opt; > return DB; > } > > -inline const StreamableDiagnosticBase & -operator<<(const > StreamableDiagnosticBase &DB, > - const llvm::Optional<FixItHint> &Opt) { > +inline const DiagnosticBuilder & > +operator<<(const DiagnosticBuilder &DB, const > +llvm::Optional<FixItHint> &Opt) { > if (Opt) > DB << *Opt; > return DB; > @@ -1363,8 +1324,8 @@ operator<<(const StreamableDiagnosticBase &DB, > /// context-sensitive keyword. > using DiagNullabilityKind = std::pair<NullabilityKind, bool>; > > -const StreamableDiagnosticBase &operator<<(const StreamableDiagnosticBase > &DB, > - DiagNullabilityKind nullability); > +const DiagnosticBuilder &operator<<(const DiagnosticBuilder &DB, > + DiagNullabilityKind nullability); > > inline DiagnosticBuilder DiagnosticsEngine::Report(SourceLocation Loc, > unsigned DiagID) { > @@ -1376,8 +1337,8 @@ inline DiagnosticBuilder > DiagnosticsEngine::Report(SourceLocation Loc, > return DiagnosticBuilder(this); > } > > -const StreamableDiagnosticBase &operator<<(const StreamableDiagnosticBase > &DB, > - llvm::Error &&E); > +const DiagnosticBuilder &operator<<(const DiagnosticBuilder &DB, > + llvm::Error &&E); > > inline DiagnosticBuilder DiagnosticsEngine::Report(unsigned DiagID) { > return Report(SourceLocation(), DiagID); > > diff --git a/clang/include/clang/Basic/PartialDiagnostic.h > b/clang/include/clang/Basic/PartialDiagnostic.h > index 5f2fa6efc279..107d621f0dec 100644 > --- a/clang/include/clang/Basic/PartialDiagnostic.h > +++ b/clang/include/clang/Basic/PartialDiagnostic.h > @@ -31,7 +31,7 @@ namespace clang { > class DeclContext; > class IdentifierInfo; > > -class PartialDiagnostic : public StreamableDiagnosticBase { > +class PartialDiagnostic { > public: > enum { > // The MaxArguments and MaxFixItHints member enum values from > @@ -163,15 +163,14 @@ class PartialDiagnostic : public > StreamableDiagnosticBase { > DiagStorage = nullptr; > } > > -public: > - void AddSourceRange(const CharSourceRange &R) const override { > + void AddSourceRange(const CharSourceRange &R) const { > if (!DiagStorage) > DiagStorage = getStorage(); > > DiagStorage->DiagRanges.push_back(R); > } > > - void AddFixItHint(const FixItHint &Hint) const override { > + void AddFixItHint(const FixItHint &Hint) const { > if (Hint.isNull()) > return; > > @@ -181,6 +180,7 @@ class PartialDiagnostic : public StreamableDiagnosticBase > { > DiagStorage->FixItHints.push_back(Hint); > } > > +public: > struct NullDiagnostic {}; > > /// Create a null partial diagnostic, which cannot carry a payload, > @@ -198,23 +198,6 @@ class PartialDiagnostic : public > StreamableDiagnosticBase { > } > } > > - template <typename T> const PartialDiagnostic &operator<<(const T &V) > const { > - const StreamableDiagnosticBase &DB = *this; > - DB << V; > - return *this; > - } > - > - // It is necessary to limit this to rvalue reference to avoid > calling this > - // function with a bitfield lvalue argument since non-const > reference to > - // bitfield is not allowed. > - template <typename T, typename = typename std::enable_if< > - !std::is_lvalue_reference<T>::value>::type> > - const PartialDiagnostic &operator<<(T &&V) const { > - const StreamableDiagnosticBase &DB = *this; > - DB << std::move(V); > - return *this; > - } > - > PartialDiagnostic(PartialDiagnostic &&Other) > : DiagID(Other.DiagID), DiagStorage(Other.DiagStorage), > Allocator(Other.Allocator) { > @@ -272,7 +255,9 @@ class PartialDiagnostic : public StreamableDiagnosticBase > { > return *this; > } > > - virtual ~PartialDiagnostic() { freeStorage(); } > + ~PartialDiagnostic() { > + freeStorage(); > + } > > void swap(PartialDiagnostic &PD) { > std::swap(DiagID, PD.DiagID); > @@ -282,8 +267,7 @@ class PartialDiagnostic : public > StreamableDiagnosticBase { > > unsigned getDiagID() const { return DiagID; } > > - void AddTaggedVal(intptr_t V, > - DiagnosticsEngine::ArgumentKind Kind) const override { > + void AddTaggedVal(intptr_t V, DiagnosticsEngine::ArgumentKind Kind) > + const { > if (!DiagStorage) > DiagStorage = getStorage(); > > @@ -293,7 +277,7 @@ class PartialDiagnostic : public StreamableDiagnosticBase > { > DiagStorage->DiagArgumentsVal[DiagStorage->NumDiagArgs++] = V; > } > > - void AddString(StringRef V) const override { > + void AddString(StringRef V) const { > if (!DiagStorage) > DiagStorage = getStorage(); > > @@ -356,6 +340,70 @@ class PartialDiagnostic : public > StreamableDiagnosticBase { > == DiagnosticsEngine::ak_std_string && "Not a string arg"); > return DiagStorage->DiagArgumentsStr[I]; > } > + > + friend const PartialDiagnostic &operator<<(const PartialDiagnostic &PD, > + unsigned I) { > + PD.AddTaggedVal(I, DiagnosticsEngine::ak_uint); > + return PD; > + } > + > + friend const PartialDiagnostic &operator<<(const PartialDiagnostic &PD, > + int I) { > + PD.AddTaggedVal(I, DiagnosticsEngine::ak_sint); > + return PD; > + } > + > + friend inline const PartialDiagnostic &operator<<(const PartialDiagnostic > &PD, > + const char *S) { > + PD.AddTaggedVal(reinterpret_cast<intptr_t>(S), > + DiagnosticsEngine::ak_c_string); > + return PD; > + } > + > + friend inline const PartialDiagnostic &operator<<(const PartialDiagnostic > &PD, > + StringRef S) { > + > + PD.AddString(S); > + return PD; > + } > + > + friend inline const PartialDiagnostic &operator<<(const PartialDiagnostic > &PD, > + const IdentifierInfo > *II) { > + PD.AddTaggedVal(reinterpret_cast<intptr_t>(II), > + DiagnosticsEngine::ak_identifierinfo); > + return PD; > + } > + > + // Adds a DeclContext to the diagnostic. The enable_if template > + magic is here // so that we only match those arguments that are > + (statically) DeclContexts; // other arguments that derive from > + DeclContext (e.g., RecordDecls) will not // match. > + template <typename T> > + friend inline std::enable_if_t<std::is_same<T, DeclContext>::value, > + const PartialDiagnostic &> > + operator<<(const PartialDiagnostic &PD, T *DC) { > + PD.AddTaggedVal(reinterpret_cast<intptr_t>(DC), > + DiagnosticsEngine::ak_declcontext); > + return PD; > + } > + > + friend inline const PartialDiagnostic &operator<<(const PartialDiagnostic > &PD, > + SourceRange R) { > + PD.AddSourceRange(CharSourceRange::getTokenRange(R)); > + return PD; > + } > + > + friend inline const PartialDiagnostic &operator<<(const PartialDiagnostic > &PD, > + const CharSourceRange > &R) { > + PD.AddSourceRange(R); > + return PD; > + } > + > + friend const PartialDiagnostic &operator<<(const PartialDiagnostic &PD, > + const FixItHint &Hint) { > + PD.AddFixItHint(Hint); > + return PD; > + } > }; > > inline const DiagnosticBuilder &operator<<(const DiagnosticBuilder > &DB, > > diff --git a/clang/include/clang/Sema/Ownership.h > b/clang/include/clang/Sema/Ownership.h > index 66c4e917c649..7c7b1d35c9fd 100644 > --- a/clang/include/clang/Sema/Ownership.h > +++ b/clang/include/clang/Sema/Ownership.h > @@ -133,7 +133,7 @@ namespace llvm { > namespace clang { > > // Basic > - class StreamableDiagnosticBase; > + class DiagnosticBuilder; > > // Determines whether the low bit of the result pointer for the > // given UID is always zero. If so, ActionResult will use that bit > @@ -280,12 +280,8 @@ namespace clang { > inline StmtResult StmtError() { return StmtResult(true); } > inline TypeResult TypeError() { return TypeResult(true); } > > - inline ExprResult ExprError(const StreamableDiagnosticBase &) { > - return ExprError(); > - } > - inline StmtResult StmtError(const StreamableDiagnosticBase &) { > - return StmtError(); > - } > + inline ExprResult ExprError(const DiagnosticBuilder&) { return > + ExprError(); } inline StmtResult StmtError(const > + DiagnosticBuilder&) { return StmtError(); } > > inline ExprResult ExprEmpty() { return ExprResult(false); } > inline StmtResult StmtEmpty() { return StmtResult(false); } > > diff --git a/clang/include/clang/Sema/ParsedAttr.h > b/clang/include/clang/Sema/ParsedAttr.h > index 8b4d04afd1a8..8946b12ee03f 100644 > --- a/clang/include/clang/Sema/ParsedAttr.h > +++ b/clang/include/clang/Sema/ParsedAttr.h > @@ -1044,20 +1044,34 @@ enum AttributeDeclKind { > ExpectedFunctionWithProtoType, > }; > > -inline const StreamableDiagnosticBase & -operator<<(const > StreamableDiagnosticBase &DB, const ParsedAttr &At) { > +inline const DiagnosticBuilder &operator<<(const DiagnosticBuilder &DB, > + const ParsedAttr &At) { > DB.AddTaggedVal(reinterpret_cast<intptr_t>(At.getAttrName()), > DiagnosticsEngine::ak_identifierinfo); > return DB; > } > > -inline const StreamableDiagnosticBase & -operator<<(const > StreamableDiagnosticBase &DB, const ParsedAttr *At) { > +inline const PartialDiagnostic &operator<<(const PartialDiagnostic &PD, > + const ParsedAttr &At) { > + PD.AddTaggedVal(reinterpret_cast<intptr_t>(At.getAttrName()), > + DiagnosticsEngine::ak_identifierinfo); > + return PD; > +} > + > +inline const DiagnosticBuilder &operator<<(const DiagnosticBuilder &DB, > + const ParsedAttr *At) { > DB.AddTaggedVal(reinterpret_cast<intptr_t>(At->getAttrName()), > DiagnosticsEngine::ak_identifierinfo); > return DB; > } > > +inline const PartialDiagnostic &operator<<(const PartialDiagnostic &PD, > + const ParsedAttr *At) { > + PD.AddTaggedVal(reinterpret_cast<intptr_t>(At->getAttrName()), > + DiagnosticsEngine::ak_identifierinfo); > + return PD; > +} > + > } // namespace clang > > #endif // LLVM_CLANG_SEMA_ATTRIBUTELIST_H > > diff --git a/clang/include/clang/Sema/Sema.h > b/clang/include/clang/Sema/Sema.h index 4a22580a22ff..e05ff2e3a9ac > 100644 > --- a/clang/include/clang/Sema/Sema.h > +++ b/clang/include/clang/Sema/Sema.h > @@ -1511,17 +1511,6 @@ class Sema final { > BaseDiag << Value; > return Diag; > } > - > - // It is necessary to limit this to rvalue reference to avoid calling > this > - // function with a bitfield lvalue argument since non-const reference to > - // bitfield is not allowed. > - template <typename T, typename = typename std::enable_if< > - !std::is_lvalue_reference<T>::value>::type> > - const SemaDiagnosticBuilder &operator<<(T &&V) const { > - const StreamableDiagnosticBase &DB = *this; > - DB << std::move(V); > - return *this; > - } > }; > > /// Emit a diagnostic. > > diff --git a/clang/lib/AST/ASTContext.cpp > b/clang/lib/AST/ASTContext.cpp index 84f747361235..fc7abeaae9b1 100644 > --- a/clang/lib/AST/ASTContext.cpp > +++ b/clang/lib/AST/ASTContext.cpp > @@ -11298,9 +11298,9 @@ OMPTraitInfo &ASTContext::getNewOMPTraitInfo() { > return *OMPTraitInfoVector.back(); > } > > -const StreamableDiagnosticBase &clang:: > -operator<<(const StreamableDiagnosticBase &DB, > - const ASTContext::SectionInfo &Section) { > +const DiagnosticBuilder & > +clang::operator<<(const DiagnosticBuilder &DB, > + const ASTContext::SectionInfo &Section) { > if (Section.Decl) > return DB << Section.Decl; > return DB << "a prior #pragma section"; > > diff --git a/clang/lib/AST/DeclCXX.cpp b/clang/lib/AST/DeclCXX.cpp > index 9673fbfb5fec..59ae5cb300f7 100644 > --- a/clang/lib/AST/DeclCXX.cpp > +++ b/clang/lib/AST/DeclCXX.cpp > @@ -3301,7 +3301,12 @@ static const char *getAccessName(AccessSpecifier AS) { > llvm_unreachable("Invalid access specifier!"); } > > -const StreamableDiagnosticBase &clang:: > -operator<<(const StreamableDiagnosticBase &DB, AccessSpecifier AS) { > +const DiagnosticBuilder &clang::operator<<(const DiagnosticBuilder &DB, > + AccessSpecifier AS) { > + return DB << getAccessName(AS); > +} > + > +const PartialDiagnostic &clang::operator<<(const PartialDiagnostic &DB, > + AccessSpecifier AS) { > return DB << getAccessName(AS); > } > > diff --git a/clang/lib/AST/TemplateBase.cpp > b/clang/lib/AST/TemplateBase.cpp index 0ac84c2357e4..6a3d2b30e46e > 100644 > --- a/clang/lib/AST/TemplateBase.cpp > +++ b/clang/lib/AST/TemplateBase.cpp > @@ -448,8 +448,8 @@ SourceRange TemplateArgumentLoc::getSourceRange() const { > llvm_unreachable("Invalid TemplateArgument Kind!"); } > > -template <typename T> > -static const T &DiagTemplateArg(const T &DB, const TemplateArgument > &Arg) { > +const DiagnosticBuilder &clang::operator<<(const DiagnosticBuilder &DB, > + const TemplateArgument > +&Arg) { > switch (Arg.getKind()) { > case TemplateArgument::Null: > // This is bad, but not as bad as crashing because of argument @@ > -502,11 +502,6 @@ static const T &DiagTemplateArg(const T &DB, const > TemplateArgument &Arg) { > llvm_unreachable("Invalid TemplateArgument Kind!"); } > > -const StreamableDiagnosticBase &clang:: > -operator<<(const StreamableDiagnosticBase &DB, const TemplateArgument > &Arg) { > - return DiagTemplateArg(DB, Arg); > -} > - > const ASTTemplateArgumentListInfo * > ASTTemplateArgumentListInfo::Create(const ASTContext &C, > const TemplateArgumentListInfo > &List) { > > diff --git a/clang/lib/AST/TemplateName.cpp > b/clang/lib/AST/TemplateName.cpp index 14e3da12db24..40a8736ae1af > 100644 > --- a/clang/lib/AST/TemplateName.cpp > +++ b/clang/lib/AST/TemplateName.cpp > @@ -254,8 +254,8 @@ TemplateName::print(raw_ostream &OS, const PrintingPolicy > &Policy, > } > } > > -const StreamableDiagnosticBase &clang:: > -operator<<(const StreamableDiagnosticBase &DB, TemplateName N) { > +const DiagnosticBuilder &clang::operator<<(const DiagnosticBuilder &DB, > + TemplateName N) { > std::string NameStr; > llvm::raw_string_ostream OS(NameStr); > LangOptions LO; > @@ -268,6 +268,20 @@ operator<<(const StreamableDiagnosticBase &DB, > TemplateName N) { > return DB << NameStr; > } > > +const PartialDiagnostic&clang::operator<<(const PartialDiagnostic &PD, > + TemplateName N) { > + std::string NameStr; > + llvm::raw_string_ostream OS(NameStr); > + LangOptions LO; > + LO.CPlusPlus = true; > + LO.Bool = true; > + OS << '\''; > + N.print(OS, PrintingPolicy(LO)); > + OS << '\''; > + OS.flush(); > + return PD << NameStr; > +} > + > void TemplateName::dump(raw_ostream &OS) const { > LangOptions LO; // FIXME! > LO.CPlusPlus = true; > > diff --git a/clang/lib/Basic/Diagnostic.cpp > b/clang/lib/Basic/Diagnostic.cpp index 2673b9d3bea4..661eabf9bc7c > 100644 > --- a/clang/lib/Basic/Diagnostic.cpp > +++ b/clang/lib/Basic/Diagnostic.cpp > @@ -40,9 +40,8 @@ > > using namespace clang; > > -const StreamableDiagnosticBase &clang:: > -operator<<(const StreamableDiagnosticBase &DB, > - DiagNullabilityKind nullability) { > +const DiagnosticBuilder &clang::operator<<(const DiagnosticBuilder &DB, > + DiagNullabilityKind > +nullability) { > StringRef string; > switch (nullability.first) { > case NullabilityKind::NonNull: > @@ -62,8 +61,8 @@ operator<<(const StreamableDiagnosticBase &DB, > return DB; > } > > -const StreamableDiagnosticBase &clang:: > -operator<<(const StreamableDiagnosticBase &DB, llvm::Error &&E) { > +const DiagnosticBuilder &clang::operator<<(const DiagnosticBuilder &DB, > + llvm::Error &&E) { > DB.AddString(toString(std::move(E))); > return DB; > } > > > > _______________________________________________ > cfe-commits mailing list > cfe-commits@lists.llvm.org > https://nam11.safelinks.protection.outlook.com/?url=https%3A%2F%2Flist > s.llvm.org%2Fcgi-bin%2Fmailman%2Flistinfo%2Fcfe-commits&data=02%7C > 01%7Cyaxun.liu%40amd.com%7C1165c7b467ad471f371b08d85b358dcf%7C3dd8961f > e4884e608e11a82d994e183d%7C0%7C0%7C637359632868922532&sdata=GtaSA% > 2Fp3y8fbEb6sr7t3BvcGjnfEykuyT6SwXsgoBUI%3D&reserved=0 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits