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