Created attachment 10100 [details] Gdb backtrace for the assertion failure This assertion failure reproduces with Clang 3.2 and Clang trunk as of 26-Feb-2013. The following code is ill-formed: $ cat t.cpp template<typename T> T tf() { static const T i; return i; } void f() { tf<int>(); } Compiling it directly to object file results in an appropriate diagnostic: $ clang -c t.cpp t.cpp:5:20: error: default initialization of an object of const type 'const int' static const T i; ^ t.cpp:10:5: note: in instantiation of function template specialization 'tf<int>' requested here tf<int>(); ^ 1 error generated. Emitting to an AST file and then compiling from it results in an assertion failure when constructing the diagnostic: $ clang -emit-ast t.cpp $ clang -v -c t.ast clang version 3.2 (tags/RELEASE_32/final) Target: x86_64-unknown-linux-gnu Thread model: posix "/nfs/thonermann/clang-3.2/installs/linux64-debug/bin/clang" -cc1 -triple x86_64-unknown-linux-gnu -emit-obj -mrelax-all -disable-free -main-file-name t.ast -mrelocation-model static -mdisable-fp-elim -fmath-errno -masm-verbose -mconstructor-aliases -munwind-tables -target-cpu x86-64 -target-linker-version 2.22 -momit-leaf-frame-pointer -v -coverage-file /nfs/thonermann/prevent-clang/clang/testcases/emit/globals/psf-useval-template-function-local-static-const-int/t.o -resource-dir /nfs/thonermann/clang-3.2/installs/linux64-debug/bin/../lib/clang/3.2 -fdebug-compilation-dir /nfs/thonermann/prevent-clang/clang/testcases/emit/globals/psf-useval-template-function-local-static-const-int -ferror-limit 19 -fmessage-length 197 -mstackrealign -fobjc-runtime=gcc -fdiagnostics-show-option -fcolor-diagnostics -o t.o -x ast t.ast clang -cc1 version 3.2 based upon LLVM 3.2svn default target x86_64-unknown-linux-gnu clang: /nfs/thonermann/clang-3.2/llvm-3.2/tools/clang/lib/Frontend/TextDiagnosticPrinter.cpp:148: virtual void clang::TextDiagnosticPrinter::HandleDiagnostic(clang::DiagnosticsEngine::Level, const clang::Diagnostic&): Assertion `TextDiag && "Unexpected diagnostic outside source file processing"' failed. clang: error: unable to execute command: Segmentation fault (core dumped) clang: error: clang frontend command failed due to signal (use -v to see invocation) clang version 3.2 (tags/RELEASE_32/final) Target: x86_64-unknown-linux-gnu Thread model: posix clang: note: diagnostic msg: PLEASE submit a bug report to http://llvm.org/bugs/ and include the crash backtrace, preprocessed source, and associated run script. clang: note: diagnostic msg: Error generating preprocessed source(s) - no preprocessable inputs. A backtrace is attached.
Here is another example test case. The diagnostic in this case is a warning, not an error. $ cat t.cpp template<typename T> struct S { T *mf(); }; template<typename T> T *S<T>::mf() { // warning: control reaches end of non-void function [-Wreturn-type] } void f() { S<int>().mf(); } I suspect the assertion failure occurs whenever a diagnostic is issued for a template instantiation in an AST file, but I haven't tried to prove this.
Fixed in r177336.