Hi Alexander, This test is failing on i386 (32-bit) Darwin:
> > /Users/buildslave/zorg/buildbot/smooshlab/slave-0.8/build.apple-clang-x86_64-darwin10-R/clang.src/src/tools/clang/test/Tooling/clang-ast-dump.cpp:3:11: > error: expected string not found in input > // CHECK: <CXXMethod ptr="0x{{[0-9a-f]+}}" name="theMethod" > prototype="true"> > ^ Any idea why that would be? It's not obvious to me what's going wrong. -Jim On Jul 16, 2012, at 5:46 AM, Alexander Kornienko <ale...@google.com> wrote: > Author: alexfh > Date: Mon Jul 16 07:46:48 2012 > New Revision: 160265 > > URL: http://llvm.org/viewvc/llvm-project?rev=160265&view=rev > Log: > The new clang-ast-dump tool for selective AST dumping. Moved common > command-line tool stuff to CommandLineClangTool > > Added: > cfe/trunk/include/clang/Tooling/CommandLineClangTool.h > cfe/trunk/lib/Tooling/CommandLineClangTool.cpp > cfe/trunk/test/Tooling/clang-ast-dump.cpp > cfe/trunk/tools/clang-ast-dump/ > cfe/trunk/tools/clang-ast-dump/CMakeLists.txt > cfe/trunk/tools/clang-ast-dump/ClangASTDump.cpp > cfe/trunk/tools/clang-ast-dump/Makefile > Modified: > cfe/trunk/lib/Tooling/CMakeLists.txt > cfe/trunk/test/CMakeLists.txt > cfe/trunk/tools/CMakeLists.txt > cfe/trunk/tools/Makefile > cfe/trunk/tools/clang-check/ClangCheck.cpp > > Added: cfe/trunk/include/clang/Tooling/CommandLineClangTool.h > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Tooling/CommandLineClangTool.h?rev=160265&view=auto > ============================================================================== > --- cfe/trunk/include/clang/Tooling/CommandLineClangTool.h (added) > +++ cfe/trunk/include/clang/Tooling/CommandLineClangTool.h Mon Jul 16 > 07:46:48 2012 > @@ -0,0 +1,80 @@ > +//===- CommandLineClangTool.h - command-line clang tools driver -*- C++ > -*-===// > +// > +// The LLVM Compiler Infrastructure > +// > +// This file is distributed under the University of Illinois Open Source > +// License. See LICENSE.TXT for details. > +// > +//===----------------------------------------------------------------------===// > +// > +// This file implements the CommandLineClangTool class used to run clang > +// tools as separate command-line applications with a consistent common > +// interface for handling compilation database and input files. > +// > +// It provides a common subset of command-line options, common algorithm > +// for locating a compilation database and source files, and help messages > +// for the basic command-line interface. > +// > +// It creates a CompilationDatabase, initializes a ClangTool and runs a > +// user-specified FrontendAction over all TUs in which the given files are > +// compiled. > +// > +// This class uses the Clang Tooling infrastructure, see > +// http://clang.llvm.org/docs/HowToSetupToolingForLLVM.html > +// for details on setting it up with LLVM source tree. > +// > +//===----------------------------------------------------------------------===// > + > +#ifndef LLVM_TOOLS_CLANG_INCLUDE_CLANG_TOOLING_COMMANDLINECLANGTOOL_H > +#define LLVM_TOOLS_CLANG_INCLUDE_CLANG_TOOLING_COMMANDLINECLANGTOOL_H > + > +#include "llvm/Support/CommandLine.h" > +#include "clang/Tooling/CompilationDatabase.h" > + > +namespace clang { > + > +namespace tooling { > + > +class CompilationDatabase; > +class FrontendActionFactory; > + > +/// \brief A common driver for command-line Clang tools. > +/// > +/// Parses a common subset of command-line arguments, locates and loads a > +/// compilation commands database, runs a tool with user-specified action. It > +/// also contains a help message for the common command-line options. > +/// An example of usage: > +/// @code > +/// int main(int argc, const char **argv) { > +/// CommandLineClangTool Tool; > +/// cl::extrahelp MoreHelp("\nMore help text..."); > +/// Tool.initialize(argc, argv); > +/// return Tool.run(newFrontendActionFactory<clang::SyntaxOnlyAction>()); > +/// } > +/// @endcode > +/// > +class CommandLineClangTool { > +public: > + /// Sets up command-line options and help messages. > + /// Add your own help messages after constructing this tool. > + CommandLineClangTool(); > + > + /// Parses command-line, initializes a compilation database. > + /// This method exits program in case of error. > + void initialize(int argc, const char **argv); > + > + /// Runs a clang tool with an action created by \c ActionFactory. > + int run(FrontendActionFactory *ActionFactory); > + > +private: > + llvm::OwningPtr<CompilationDatabase> Compilations; > + llvm::cl::opt<std::string> BuildPath; > + llvm::cl::list<std::string> SourcePaths; > + llvm::cl::extrahelp MoreHelp; > +}; > + > +} // namespace tooling > + > +} // namespace clang > + > +#endif // LLVM_TOOLS_CLANG_INCLUDE_CLANG_TOOLING_COMMANDLINECLANGTOOL_H > > Modified: cfe/trunk/lib/Tooling/CMakeLists.txt > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Tooling/CMakeLists.txt?rev=160265&r1=160264&r2=160265&view=diff > ============================================================================== > --- cfe/trunk/lib/Tooling/CMakeLists.txt (original) > +++ cfe/trunk/lib/Tooling/CMakeLists.txt Mon Jul 16 07:46:48 2012 > @@ -1,6 +1,7 @@ > set(LLVM_LINK_COMPONENTS support) > > add_clang_library(clangTooling > + CommandLineClangTool.cpp > CompilationDatabase.cpp > Refactoring.cpp > Tooling.cpp > > Added: cfe/trunk/lib/Tooling/CommandLineClangTool.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Tooling/CommandLineClangTool.cpp?rev=160265&view=auto > ============================================================================== > --- cfe/trunk/lib/Tooling/CommandLineClangTool.cpp (added) > +++ cfe/trunk/lib/Tooling/CommandLineClangTool.cpp Mon Jul 16 07:46:48 2012 > @@ -0,0 +1,80 @@ > +//===--- CommandLineClangTool.cpp - command-line clang tools driver > -------===// > +// > +// The LLVM Compiler Infrastructure > +// > +// This file is distributed under the University of Illinois Open Source > +// License. See LICENSE.TXT for details. > +// > +//===----------------------------------------------------------------------===// > +// > +// This file implements the CommandLineClangTool class used to run clang > +// tools as separate command-line applications with a consistent common > +// interface for handling compilation database and input files. > +// > +// It provides a common subset of command-line options, common algorithm > +// for locating a compilation database and source files, and help messages > +// for the basic command-line interface. > +// > +// It creates a CompilationDatabase, initializes a ClangTool and runs a > +// user-specified FrontendAction over all TUs in which the given files are > +// compiled. > +// > +//===----------------------------------------------------------------------===// > + > +#include "clang/Frontend/FrontendActions.h" > +#include "clang/Tooling/CommandLineClangTool.h" > +#include "clang/Tooling/Tooling.h" > + > +using namespace clang::tooling; > +using namespace llvm; > + > +static const char *MoreHelpText = > + "\n" > + "-p <build-path> is used to read a compile command database.\n" > + "\n" > + "\tFor example, it can be a CMake build directory in which a file > named\n" > + "\tcompile_commands.json exists (use > -DCMAKE_EXPORT_COMPILE_COMMANDS=ON\n" > + "\tCMake option to get this output). When no build path is specified,\n" > + "\tclang-check will attempt to locate it automatically using all > parent\n" > + "\tpaths of the first input file. See:\n" > + "\thttp://clang.llvm.org/docs/HowToSetupToolingForLLVM.html for an\n" > + "\texample of setting up Clang Tooling on a source tree.\n" > + "\n" > + "<source0> ... specify the paths of source files. These paths are > looked\n" > + "\tup in the compile command database. If the path of a file is > absolute,\n" > + "\tit needs to point into CMake's source tree. If the path is > relative,\n" > + "\tthe current working directory needs to be in the CMake source tree > and\n" > + "\tthe file must be in a subdirectory of the current working > directory.\n" > + "\t\"./\" prefixes in the relative files will be automatically > removed,\n" > + "\tbut the rest of a relative path must be a suffix of a path in the\n" > + "\tcompile command database.\n" > + "\n"; > + > +CommandLineClangTool::CommandLineClangTool() : > + BuildPath("p", cl::desc("Build path"), cl::Optional), > + SourcePaths(cl::Positional, cl::desc("<source0> [... <sourceN>]"), > + cl::OneOrMore), > + MoreHelp(MoreHelpText) { > +} > + > +void CommandLineClangTool::initialize(int argc, const char **argv) { > + Compilations.reset(FixedCompilationDatabase::loadFromCommandLine(argc, > argv)); > + cl::ParseCommandLineOptions(argc, argv); > + if (!Compilations) { > + std::string ErrorMessage; > + if (!BuildPath.empty()) { > + Compilations.reset(CompilationDatabase::autoDetectFromDirectory( > + BuildPath, ErrorMessage)); > + } else { > + Compilations.reset(CompilationDatabase::autoDetectFromSource( > + SourcePaths[0], ErrorMessage)); > + } > + if (!Compilations) > + llvm::report_fatal_error(ErrorMessage); > + } > +} > + > +int CommandLineClangTool::run(FrontendActionFactory *ActionFactory) { > + ClangTool Tool(*Compilations, SourcePaths); > + return Tool.run(ActionFactory); > +} > > Modified: cfe/trunk/test/CMakeLists.txt > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CMakeLists.txt?rev=160265&r1=160264&r2=160265&view=diff > ============================================================================== > --- cfe/trunk/test/CMakeLists.txt (original) > +++ cfe/trunk/test/CMakeLists.txt Mon Jul 16 07:46:48 2012 > @@ -31,7 +31,7 @@ > set(CLANG_TEST_DEPS > clang clang-headers > c-index-test diagtool arcmt-test c-arcmt-test > - clang-check > + clang-check clang-ast-dump > llvm-dis llc opt FileCheck count not > ) > set(CLANG_TEST_PARAMS > @@ -80,7 +80,7 @@ > COMMENT "Running Clang regression tests" > DEPENDS clang clang-headers > c-index-test diagtool arcmt-test c-arcmt-test > - clang-check > + clang-check clang-ast-dump > ) > set_target_properties(check-clang PROPERTIES FOLDER "Clang tests") > endif() > > Added: cfe/trunk/test/Tooling/clang-ast-dump.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Tooling/clang-ast-dump.cpp?rev=160265&view=auto > ============================================================================== > --- cfe/trunk/test/Tooling/clang-ast-dump.cpp (added) > +++ cfe/trunk/test/Tooling/clang-ast-dump.cpp Mon Jul 16 07:46:48 2012 > @@ -0,0 +1,22 @@ > +// RUN: clang-ast-dump "%t/test.cpp" -f test_namespace::TheClass::theMethod > -- -c 2>&1|FileCheck %s > +// FIXME: Make the above easier. > + > +// CHECK: <CXXMethod ptr="0x{{[0-9a-f]+}}" name="theMethod" prototype="true"> > +// CHECK: <ParmVar ptr="0x{{[0-9a-f]+}}" name="x" initstyle="c"> > +// CHECK: (CompoundStmt > +// CHECK-NEXT: (ReturnStmt > +// CHECK-NEXT: (BinaryOperator > + > +namespace test_namespace { > + > +class TheClass { > +public: > + int theMethod(int x) { > + return x + x; > + } > +}; > + > +} > + > +// FIXME: This is incompatible to -fms-compatibility. > +// XFAIL: win32 > > Modified: cfe/trunk/tools/CMakeLists.txt > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/CMakeLists.txt?rev=160265&r1=160264&r2=160265&view=diff > ============================================================================== > --- cfe/trunk/tools/CMakeLists.txt (original) > +++ cfe/trunk/tools/CMakeLists.txt Mon Jul 16 07:46:48 2012 > @@ -5,3 +5,4 @@ > add_subdirectory(diagtool) > add_subdirectory(driver) > add_subdirectory(clang-check) > +add_subdirectory(clang-ast-dump) > > Modified: cfe/trunk/tools/Makefile > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/Makefile?rev=160265&r1=160264&r2=160265&view=diff > ============================================================================== > --- cfe/trunk/tools/Makefile (original) > +++ cfe/trunk/tools/Makefile Mon Jul 16 07:46:48 2012 > @@ -9,7 +9,7 @@ > > CLANG_LEVEL := .. > DIRS := driver libclang c-index-test arcmt-test c-arcmt-test diagtool \ > - clang-check > + clang-check clang-ast-dump > > include $(CLANG_LEVEL)/../../Makefile.config > > > Added: cfe/trunk/tools/clang-ast-dump/CMakeLists.txt > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/clang-ast-dump/CMakeLists.txt?rev=160265&view=auto > ============================================================================== > --- cfe/trunk/tools/clang-ast-dump/CMakeLists.txt (added) > +++ cfe/trunk/tools/clang-ast-dump/CMakeLists.txt Mon Jul 16 07:46:48 2012 > @@ -0,0 +1,8 @@ > +add_clang_executable(clang-ast-dump > + ClangASTDump.cpp > + ) > + > +target_link_libraries(clang-ast-dump > + clangTooling > + clangBasic > + ) > > Added: cfe/trunk/tools/clang-ast-dump/ClangASTDump.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/clang-ast-dump/ClangASTDump.cpp?rev=160265&view=auto > ============================================================================== > --- cfe/trunk/tools/clang-ast-dump/ClangASTDump.cpp (added) > +++ cfe/trunk/tools/clang-ast-dump/ClangASTDump.cpp Mon Jul 16 07:46:48 2012 > @@ -0,0 +1,141 @@ > +//===- tools/clang-ast-dump/ClangASTDump.cpp - Clang AST Dump tool > --------===// > +// > +// The LLVM Compiler Infrastructure > +// > +// This file is distributed under the University of Illinois Open Source > +// License. See LICENSE.TXT for details. > +// > +//===----------------------------------------------------------------------===// > +// > +// This file implements a clang-ast-dump tool that dumps specified parts > +// of an AST of a number of translation units. > +// > +// Run with '-help' for details. > +// > +// This tool uses the Clang Tooling infrastructure, see > +// http://clang.llvm.org/docs/HowToSetupToolingForLLVM.html > +// for details on setting it up with LLVM source tree. > +// > +//===----------------------------------------------------------------------===// > + > +#include "llvm/Support/CommandLine.h" > +#include "clang/AST/ASTContext.h" > +#include "clang/AST/ASTConsumer.h" > +#include "clang/AST/RecursiveASTVisitor.h" > +#include "clang/Frontend/FrontendActions.h" > +#include "clang/Tooling/CommandLineClangTool.h" > +#include "clang/Tooling/Tooling.h" > + > +using namespace clang::tooling; > +using namespace llvm; > + > +cl::opt<std::string> FilterString( > + "f", > + cl::desc("Filter string"), > + cl::Optional); > + > +cl::opt<bool> ListAll( > + "l", > + cl::desc("List all filterable nodes"), > + cl::init(false), > + cl::Optional); > + > +static const char *MoreHelpText = > + "-f <filter-string> can be used to dump only AST declaration nodes > having\n" > + "\ta certain substring in a qualified name.\n" > + "\n" > + "-l \tlists qualified names of all filterable declaration nodes.\n" > + "\n"; > + > +namespace { > + > +using namespace clang; > + > +class SelectiveDumpVisitor : > + public RecursiveASTVisitor<SelectiveDumpVisitor> { > + typedef RecursiveASTVisitor<SelectiveDumpVisitor> base; > +public: > + SelectiveDumpVisitor(const std::string &FilterString, bool ListAll) > + : FilterString(FilterString), ListAll(ListAll) {} > + > + ASTConsumer* newASTConsumer() { > + return new DumpConsumer(this); > + } > + > + bool shouldWalkTypesOfTypeLocs() const { return false; } > + > + void Run(TranslationUnitDecl *D) { > + if (ListAll) { > + llvm::outs().changeColor(llvm::raw_ostream::BLUE) << > + "Listing all filterable nodes:\n"; > + llvm::outs().resetColor(); > + TraverseDecl(D); > + return; > + } > + > + if (FilterString.empty()) { > + llvm::outs().changeColor(llvm::raw_ostream::BLUE) << > + "Dumping translation unit:\n"; > + llvm::outs().resetColor(); > + D->dumpXML(llvm::outs()); > + return; > + } > + > + TraverseDecl(D); > + } > + > + bool TraverseDecl(Decl *D) { > + if (ListAll) { > + std::string Name = getName(D); > + if (!Name.empty()) > + llvm::outs() << Name << "\n"; > + return base::TraverseDecl(D); > + } > + > + if (filterMatches(D)) { > + llvm::outs().changeColor(llvm::raw_ostream::BLUE) << > + "Dumping " << getName(D) << ":\n"; > + llvm::outs().resetColor(); > + D->dumpXML(llvm::outs()); > + return true; > + } > + return base::TraverseDecl(D); > + } > + > +private: > + std::string getName(Decl *D) { > + if (isa<NamedDecl>(D)) > + return cast<NamedDecl>(D)->getQualifiedNameAsString(); > + return ""; > + } > + bool filterMatches(Decl *D) { > + return getName(D).find(FilterString) != std::string::npos; > + } > + > + class DumpConsumer : public ASTConsumer { > + public: > + DumpConsumer(SelectiveDumpVisitor *Visitor) : Visitor(Visitor) {} > + > + virtual void HandleTranslationUnit(ASTContext &Context) { > + Visitor->Context = &Context; > + Visitor->Run(Context.getTranslationUnitDecl()); > + } > + > + private: > + SelectiveDumpVisitor *Visitor; > + }; > + > + ASTContext *Context; > + std::string FilterString; > + bool ListAll; > +}; > + > +} // namespace > + > +int main(int argc, const char **argv) { > + CommandLineClangTool Tool; > + cl::extrahelp MoreHelp(MoreHelpText); > + Tool.initialize(argc, argv); > + SelectiveDumpVisitor Dumper(FilterString, ListAll); > + return Tool.run(newFrontendActionFactory(&Dumper)); > +} > > Added: cfe/trunk/tools/clang-ast-dump/Makefile > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/clang-ast-dump/Makefile?rev=160265&view=auto > ============================================================================== > --- cfe/trunk/tools/clang-ast-dump/Makefile (added) > +++ cfe/trunk/tools/clang-ast-dump/Makefile Mon Jul 16 07:46:48 2012 > @@ -0,0 +1,23 @@ > +##===- tools/clang-check/Makefile --------------------------*- Makefile > -*-===## > +# > +# The LLVM Compiler Infrastructure > +# > +# This file is distributed under the University of Illinois Open Source > +# License. See LICENSE.TXT for details. > +# > +##===----------------------------------------------------------------------===## > + > +CLANG_LEVEL := ../.. > + > +TOOLNAME = clang-ast-dump > +NO_INSTALL = 1 > + > +# No plugins, optimize startup time. > +TOOL_NO_EXPORTS = 1 > + > +LINK_COMPONENTS := support mc > +USEDLIBS = clangFrontend.a clangSerialization.a clangDriver.a \ > + clangTooling.a clangParse.a clangSema.a clangAnalysis.a \ > + clangEdit.a clangAST.a clangLex.a clangBasic.a > + > +include $(CLANG_LEVEL)/Makefile > > Modified: cfe/trunk/tools/clang-check/ClangCheck.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/clang-check/ClangCheck.cpp?rev=160265&r1=160264&r2=160265&view=diff > ============================================================================== > --- cfe/trunk/tools/clang-check/ClangCheck.cpp (original) > +++ cfe/trunk/tools/clang-check/ClangCheck.cpp Mon Jul 16 07:46:48 2012 > @@ -1,4 +1,4 @@ > -//===- examples/Tooling/ClangCheck.cpp - Clang check tool > -----------------===// > +//===- tools/clang-check/ClangCheck.cpp - Clang check tool > ----------------===// > // > // The LLVM Compiler Infrastructure > // > @@ -10,75 +10,37 @@ > // This file implements a clang-check tool that runs the > // clang::SyntaxOnlyAction over a number of translation units. > // > +// This tool uses the Clang Tooling infrastructure, see > +// http://clang.llvm.org/docs/HowToSetupToolingForLLVM.html > +// for details on setting it up with LLVM source tree. > +// > //===----------------------------------------------------------------------===// > > #include "llvm/Support/CommandLine.h" > #include "clang/Frontend/FrontendActions.h" > -#include "clang/Tooling/CompilationDatabase.h" > +#include "clang/Tooling/CommandLineClangTool.h" > #include "clang/Tooling/Tooling.h" > > using namespace clang::tooling; > using namespace llvm; > > -cl::opt<std::string> BuildPath( > - "p", > - cl::desc("<build-path>"), > - cl::Optional); > - > -cl::list<std::string> SourcePaths( > - cl::Positional, > - cl::desc("<source0> [... <sourceN>]"), > - cl::OneOrMore); > - > -static cl::extrahelp MoreHelp( > - "\n" > - "<build-path> is used to read a compile command database.\n" > - "\n" > - "For example, it can be a CMake build directory in which a file named\n" > - "compile_commands.json exists (use -DCMAKE_EXPORT_COMPILE_COMMANDS=ON\n" > - "CMake option to get this output). When no build path is specified,\n" > - "clang-check will attempt to locate it automatically using all parent\n" > - "paths of the first input file.\n" > - "\n" > - "<source0> ... specify the paths of source files. These paths are > looked\n" > - "up in the compile command database. If the path of a file is > absolute,\n" > - "it needs to point into CMake's source tree. If the path is relative,\n" > - "the current working directory needs to be in the CMake source tree > and\n" > - "the file must be in a subdirectory of the current working directory.\n" > - "\"./\" prefixes in the relative files will be automatically removed,\n" > - "but the rest of a relative path must be a suffix of a path in the\n" > - "compile command database.\n" > - "\n" > - "For example, to use clang-check on all files in a subtree of the > source\n" > - "tree, use:\n" > - "\n" > - " find path/in/subtree -name '*.cpp'|xargs clang-check\n" > +static const char *MoreHelpText = > + "\tFor example, to run clang-check on all files in a subtree of the\n" > + "\tsource tree, use:\n" > "\n" > - "or using a specific build path:\n" > + "\t find path/in/subtree -name '*.cpp'|xargs clang-check\n" > "\n" > - " find path/in/subtree -name '*.cpp'|xargs clang-check -p build/path\n" > + "\tor using a specific build path:\n" > "\n" > - "Note, that path/in/subtree and current directory should follow the\n" > - "rules described above.\n" > + "\t find path/in/subtree -name '*.cpp'|xargs clang-check -p > build/path\n" > "\n" > -); > + "\tNote, that path/in/subtree and current directory should follow the\n" > + "\trules described above.\n" > + "\n"; > > int main(int argc, const char **argv) { > - llvm::OwningPtr<CompilationDatabase> Compilations( > - FixedCompilationDatabase::loadFromCommandLine(argc, argv)); > - cl::ParseCommandLineOptions(argc, argv); > - if (!Compilations) { > - std::string ErrorMessage; > - if (!BuildPath.empty()) { > - Compilations.reset( > - CompilationDatabase::autoDetectFromDirectory(BuildPath, > ErrorMessage)); > - } else { > - Compilations.reset(CompilationDatabase::autoDetectFromSource( > - SourcePaths[0], ErrorMessage)); > - } > - if (!Compilations) > - llvm::report_fatal_error(ErrorMessage); > - } > - ClangTool Tool(*Compilations, SourcePaths); > + CommandLineClangTool Tool; > + cl::extrahelp MoreHelp(MoreHelpText); > + Tool.initialize(argc, argv); > return Tool.run(newFrontendActionFactory<clang::SyntaxOnlyAction>()); > } > > > _______________________________________________ > cfe-commits mailing list > cfe-commits@cs.uiuc.edu > http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits _______________________________________________ cfe-commits mailing list cfe-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits