r181832 - Provide operator<< for stream output of DeclarationNames

Aaron Ballman aaron at aaronballman.com
Tue May 14 16:53:31 PDT 2013


Fixed in r181853 -- just needed a simple include.

~Aaron

On Tue, May 14, 2013 at 7:41 PM, jahanian <fjahanian at apple.com> wrote:
> Hi David,
>
> This patch has broken build of clang on Window’s VS. The main error coming
> out is:
>
> .../src/tools/clang/include\clang/AST/Decl.h(145): error C2027: use of
> undefined type 'llvm::raw_ostream’
>
>
> - Fariborz
>
>
> On May 14, 2013, at 2:04 PM, David Blaikie <dblaikie at gmail.com> wrote:
>
>
> Author: dblaikie
> Date: Tue May 14 16:04:00 2013
> New Revision: 181832
>
> URL: http://llvm.org/viewvc/llvm-project?rev=181832&view=rev
> Log:
> Provide operator<< for stream output of DeclarationNames
>
> ASTDumper was already trying to do this & instead got an implicit bool
> conversion by surprise (thus printing out 0 or 1 instead of the name of
> the declaration). To avoid that issue & simplify call sites, simply make
> it the normal/expected operator<<(raw_ostream&, ...) overload & simplify
> all the existing call sites. (bonus: this function doesn't need to be a
> member or friend, it's just using public API in DeclarationName)
>
> Modified:
>    cfe/trunk/include/clang/AST/Decl.h
>    cfe/trunk/include/clang/AST/DeclarationName.h
>    cfe/trunk/lib/AST/ASTDiagnostic.cpp
>    cfe/trunk/lib/AST/ASTDumper.cpp
>    cfe/trunk/lib/AST/DeclarationName.cpp
>    cfe/trunk/lib/Sema/SemaLookup.cpp
>    cfe/trunk/lib/StaticAnalyzer/Core/BugReporterVisitors.cpp
>    cfe/trunk/test/Misc/ast-dump-templates.cpp
>    cfe/trunk/tools/libclang/CIndexUSRs.cpp
>
> Modified: cfe/trunk/include/clang/AST/Decl.h
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/Decl.h?rev=181832&r1=181831&r2=181832&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/AST/Decl.h (original)
> +++ cfe/trunk/include/clang/AST/Decl.h Tue May 14 16:04:00 2013
> @@ -142,7 +142,7 @@ public:
>   // FIXME: Deprecated, move clients to getName().
>   std::string getNameAsString() const { return Name.getAsString(); }
>
> -  void printName(raw_ostream &os) const { return Name.printName(os); }
> +  void printName(raw_ostream &os) const { os << Name; }
>
>   /// getDeclName - Get the actual, stored name of the declaration,
>   /// which may be a special name.
>
> Modified: cfe/trunk/include/clang/AST/DeclarationName.h
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/DeclarationName.h?rev=181832&r1=181831&r2=181832&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/AST/DeclarationName.h (original)
> +++ cfe/trunk/include/clang/AST/DeclarationName.h Tue May 14 16:04:00 2013
> @@ -210,9 +210,6 @@ public:
>   /// getNameAsString - Retrieve the human-readable string for this name.
>   std::string getAsString() const;
>
> -  /// printName - Print the human-readable name to a stream.
> -  void printName(raw_ostream &OS) const;
> -
>   /// getAsIdentifierInfo - Retrieve the IdentifierInfo * stored in
>   /// this declaration name, or NULL if this declaration name isn't a
>   /// simple identifier.
> @@ -302,6 +299,8 @@ public:
>   void dump() const;
> };
>
> +raw_ostream &operator<<(raw_ostream &OS, DeclarationName N);
> +
> /// Ordering on two declaration names. If both names are identifiers,
> /// this provides a lexicographical ordering.
> inline bool operator<(DeclarationName LHS, DeclarationName RHS) {
>
> Modified: cfe/trunk/lib/AST/ASTDiagnostic.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/ASTDiagnostic.cpp?rev=181832&r1=181831&r2=181832&view=diff
> ==============================================================================
> --- cfe/trunk/lib/AST/ASTDiagnostic.cpp (original)
> +++ cfe/trunk/lib/AST/ASTDiagnostic.cpp Tue May 14 16:04:00 2013
> @@ -300,8 +300,7 @@ void clang::FormatASTNodeDiagnosticArgum
>         assert(ModLen == 0 && ArgLen == 0 &&
>                "Invalid modifier for DeclarationName argument");
>
> -      DeclarationName N = DeclarationName::getFromOpaqueInteger(Val);
> -      N.printName(OS);
> +      OS << DeclarationName::getFromOpaqueInteger(Val);
>       break;
>     }
>     case DiagnosticsEngine::ak_nameddecl: {
>
> Modified: cfe/trunk/lib/AST/ASTDumper.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/ASTDumper.cpp?rev=181832&r1=181831&r2=181832&view=diff
> ==============================================================================
> --- cfe/trunk/lib/AST/ASTDumper.cpp (original)
> +++ cfe/trunk/lib/AST/ASTDumper.cpp Tue May 14 16:04:00 2013
> @@ -449,9 +449,7 @@ void ASTDumper::dumpBareDeclRef(const De
>
>   if (const NamedDecl *ND = dyn_cast<NamedDecl>(D)) {
>     ColorScope Color(*this, DeclNameColor);
> -    OS << " '";
> -    ND->getDeclName().printName(OS);
> -    OS << "'";
> +    OS << " '" << ND->getDeclName() << '\'';
>   }
>
>   if (const ValueDecl *VD = dyn_cast<ValueDecl>(D))
>
> Modified: cfe/trunk/lib/AST/DeclarationName.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/DeclarationName.cpp?rev=181832&r1=181831&r2=181832&view=diff
> ==============================================================================
> --- cfe/trunk/lib/AST/DeclarationName.cpp (original)
> +++ cfe/trunk/lib/AST/DeclarationName.cpp Tue May 14 16:04:00 2013
> @@ -133,6 +133,66 @@ int DeclarationName::compare(Declaration
>   llvm_unreachable("Invalid DeclarationName Kind!");
> }
>
> +raw_ostream &operator<<(raw_ostream &OS, DeclarationName N) {
> +  switch (N.getNameKind()) {
> +  case DeclarationName::Identifier:
> +    if (const IdentifierInfo *II = N.getAsIdentifierInfo())
> +      OS << II->getName();
> +    return OS;
> +
> +  case DeclarationName::ObjCZeroArgSelector:
> +  case DeclarationName::ObjCOneArgSelector:
> +  case DeclarationName::ObjCMultiArgSelector:
> +    return OS << N.getObjCSelector().getAsString();
> +
> +  case DeclarationName::CXXConstructorName: {
> +    QualType ClassType = N.getCXXNameType();
> +    if (const RecordType *ClassRec = ClassType->getAs<RecordType>())
> +      return OS << *ClassRec->getDecl();
> +    return OS << ClassType.getAsString();
> +  }
> +
> +  case DeclarationName::CXXDestructorName: {
> +    OS << '~';
> +    QualType Type = N.getCXXNameType();
> +    if (const RecordType *Rec = Type->getAs<RecordType>())
> +      return OS << *Rec->getDecl();
> +    return OS << Type.getAsString();
> +  }
> +
> +  case DeclarationName::CXXOperatorName: {
> +    static const char* const OperatorNames[NUM_OVERLOADED_OPERATORS] = {
> +      0,
> +#define OVERLOADED_OPERATOR(Name,Spelling,Token,Unary,Binary,MemberOnly) \
> +      Spelling,
> +#include "clang/Basic/OperatorKinds.def"
> +    };
> +    const char *OpName = OperatorNames[N.getCXXOverloadedOperator()];
> +    assert(OpName && "not an overloaded operator");
> +
> +    OS << "operator";
> +    if (OpName[0] >= 'a' && OpName[0] <= 'z')
> +      OS << ' ';
> +    return OS << OpName;
> +  }
> +
> +  case DeclarationName::CXXLiteralOperatorName:
> +    return OS << "operator \"\" " <<
> N.getCXXLiteralIdentifier()->getName();
> +
> +  case DeclarationName::CXXConversionFunctionName: {
> +    OS << "operator ";
> +    QualType Type = N.getCXXNameType();
> +    if (const RecordType *Rec = Type->getAs<RecordType>())
> +      return OS << *Rec->getDecl();
> +    return OS << Type.getAsString();
> +  }
> +  case DeclarationName::CXXUsingDirective:
> +    return OS << "<using-directive>";
> +  }
> +
> +  llvm_unreachable("Unexpected declaration name kind");
> +}
> +
> } // end namespace clang
>
> DeclarationName::NameKind DeclarationName::getNameKind() const {
> @@ -180,80 +240,10 @@ bool DeclarationName::isDependentName()
> std::string DeclarationName::getAsString() const {
>   std::string Result;
>   llvm::raw_string_ostream OS(Result);
> -  printName(OS);
> +  OS << *this;
>   return OS.str();
> }
>
> -void DeclarationName::printName(raw_ostream &OS) const {
> -  switch (getNameKind()) {
> -  case Identifier:
> -    if (const IdentifierInfo *II = getAsIdentifierInfo())
> -      OS << II->getName();
> -    return;
> -
> -  case ObjCZeroArgSelector:
> -  case ObjCOneArgSelector:
> -  case ObjCMultiArgSelector:
> -    OS << getObjCSelector().getAsString();
> -    return;
> -
> -  case CXXConstructorName: {
> -    QualType ClassType = getCXXNameType();
> -    if (const RecordType *ClassRec = ClassType->getAs<RecordType>())
> -      OS << *ClassRec->getDecl();
> -    else
> -      OS << ClassType.getAsString();
> -    return;
> -  }
> -
> -  case CXXDestructorName: {
> -    OS << '~';
> -    QualType Type = getCXXNameType();
> -    if (const RecordType *Rec = Type->getAs<RecordType>())
> -      OS << *Rec->getDecl();
> -    else
> -      OS << Type.getAsString();
> -    return;
> -  }
> -
> -  case CXXOperatorName: {
> -    static const char* const OperatorNames[NUM_OVERLOADED_OPERATORS] = {
> -      0,
> -#define OVERLOADED_OPERATOR(Name,Spelling,Token,Unary,Binary,MemberOnly) \
> -      Spelling,
> -#include "clang/Basic/OperatorKinds.def"
> -    };
> -    const char *OpName = OperatorNames[getCXXOverloadedOperator()];
> -    assert(OpName && "not an overloaded operator");
> -
> -    OS << "operator";
> -    if (OpName[0] >= 'a' && OpName[0] <= 'z')
> -      OS << ' ';
> -    OS << OpName;
> -    return;
> -  }
> -
> -  case CXXLiteralOperatorName:
> -    OS << "operator \"\" " << getCXXLiteralIdentifier()->getName();
> -    return;
> -
> -  case CXXConversionFunctionName: {
> -    OS << "operator ";
> -    QualType Type = getCXXNameType();
> -    if (const RecordType *Rec = Type->getAs<RecordType>())
> -      OS << *Rec->getDecl();
> -    else
> -      OS << Type.getAsString();
> -    return;
> -  }
> -  case CXXUsingDirective:
> -    OS << "<using-directive>";
> -    return;
> -  }
> -
> -  llvm_unreachable("Unexpected declaration name kind");
> -}
> -
> QualType DeclarationName::getCXXNameType() const {
>   if (CXXSpecialName *CXXName = getAsCXXSpecialName())
>     return CXXName->Type;
> @@ -336,8 +326,7 @@ DeclarationName DeclarationName::getUsin
> }
>
> void DeclarationName::dump() const {
> -  printName(llvm::errs());
> -  llvm::errs() << '\n';
> +  llvm::errs() << *this << '\n';
> }
>
> DeclarationNameTable::DeclarationNameTable(const ASTContext &C) : Ctx(C) {
> @@ -537,7 +526,7 @@ void DeclarationNameInfo::printName(raw_
>   case DeclarationName::CXXOperatorName:
>   case DeclarationName::CXXLiteralOperatorName:
>   case DeclarationName::CXXUsingDirective:
> -    Name.printName(OS);
> +    OS << Name;
>     return;
>
>   case DeclarationName::CXXConstructorName:
> @@ -549,9 +538,8 @@ void DeclarationNameInfo::printName(raw_
>       else if (Name.getNameKind() ==
> DeclarationName::CXXConversionFunctionName)
>         OS << "operator ";
>       OS << TInfo->getType().getAsString();
> -    }
> -    else
> -      Name.printName(OS);
> +    } else
> +      OS << Name;
>     return;
>   }
>   llvm_unreachable("Unexpected declaration name kind");
>
> Modified: cfe/trunk/lib/Sema/SemaLookup.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaLookup.cpp?rev=181832&r1=181831&r2=181832&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Sema/SemaLookup.cpp (original)
> +++ cfe/trunk/lib/Sema/SemaLookup.cpp Tue May 14 16:04:00 2013
> @@ -4166,7 +4166,7 @@ std::string TypoCorrection::getAsString(
>     std::string tmpBuffer;
>     llvm::raw_string_ostream PrefixOStream(tmpBuffer);
>     CorrectionNameSpec->print(PrefixOStream, PrintingPolicy(LO));
> -    CorrectionName.printName(PrefixOStream);
> +    PrefixOStream << CorrectionName;
>     return PrefixOStream.str();
>   }
>
>
> Modified: cfe/trunk/lib/StaticAnalyzer/Core/BugReporterVisitors.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/StaticAnalyzer/Core/BugReporterVisitors.cpp?rev=181832&r1=181831&r2=181832&view=diff
> ==============================================================================
> --- cfe/trunk/lib/StaticAnalyzer/Core/BugReporterVisitors.cpp (original)
> +++ cfe/trunk/lib/StaticAnalyzer/Core/BugReporterVisitors.cpp Tue May 14
> 16:04:00 2013
> @@ -1465,9 +1465,7 @@ ConditionBRVisitor::VisitTrueTest(const
>   SmallString<256> Buf;
>   llvm::raw_svector_ostream Out(Buf);
>
> -  Out << "Assuming '";
> -  VD->getDeclName().printName(Out);
> -  Out << "' is ";
> +  Out << "Assuming '" << VD->getDeclName() << "' is ";
>
>   QualType VDTy = VD->getType();
>
>
> Modified: cfe/trunk/test/Misc/ast-dump-templates.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Misc/ast-dump-templates.cpp?rev=181832&r1=181831&r2=181832&view=diff
> ==============================================================================
> --- cfe/trunk/test/Misc/ast-dump-templates.cpp (original)
> +++ cfe/trunk/test/Misc/ast-dump-templates.cpp Tue May 14 16:04:00 2013
> @@ -1,6 +1,7 @@
> // RUN: %clang_cc1 -ast-print %s > %t
> // RUN: FileCheck < %t %s -check-prefix=CHECK1
> // RUN: FileCheck < %t %s -check-prefix=CHECK2
> +// RUN: %clang_cc1 -ast-dump %s | FileCheck --check-prefix=DUMP %s
>
> template <int X, typename Y, int Z = 5>
> struct foo {
> @@ -37,3 +38,14 @@ void baz() {
> // Template definition - bar
> // CHECK1: template <int A, typename B> B bar()
> // CHECK2: template <int A, typename B> B bar()
> +
> +namespace test2 {
> +void func(int);
> +void func(float);
> +template<typename T>
> +void tmpl() {
> +  func(T());
> +}
> +
> +// DUMP: UnresolvedLookupExpr {{.*}} <col:3> '<overloaded function type>'
> lvalue (ADL) = 'func'
> +}
>
> Modified: cfe/trunk/tools/libclang/CIndexUSRs.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/libclang/CIndexUSRs.cpp?rev=181832&r1=181831&r2=181832&view=diff
> ==============================================================================
> --- cfe/trunk/tools/libclang/CIndexUSRs.cpp (original)
> +++ cfe/trunk/tools/libclang/CIndexUSRs.cpp Tue May 14 16:04:00 2013
> @@ -309,9 +309,8 @@ void USRGenerator::VisitObjCMethodDecl(c
>   // Ideally we would use 'GenObjCMethod', but this is such a hot path
>   // for Objective-C code that we don't want to use
>   // DeclarationName::getAsString().
> -  Out << (D->isInstanceMethod() ? "(im)" : "(cm)");
> -  DeclarationName N(D->getSelector());
> -  N.printName(Out);
> +  Out << (D->isInstanceMethod() ? "(im)" : "(cm)")
> +      << DeclarationName(D->getSelector());
> }
>
> void USRGenerator::VisitObjCContainerDecl(const ObjCContainerDecl *D) {
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>




More information about the cfe-commits mailing list