LLVM Bugzilla is read-only and represents the historical archive of all LLVM issues filled before November 26, 2021. Use github to submit LLVM bugs

Bug 15377 - Clang assertion failure when issuing a diagnostic while compiling from an AST file
Summary: Clang assertion failure when issuing a diagnostic while compiling from an AST...
Status: RESOLVED FIXED
Alias: None
Product: clang
Classification: Unclassified
Component: Frontend (show other bugs)
Version: trunk
Hardware: All All
: P normal
Assignee: Unassigned Clang Bugs
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2013-02-27 13:54 PST by Tom Honermann
Modified: 2013-03-18 17:55 PDT (History)
3 users (show)

See Also:
Fixed By Commit(s):


Attachments
Gdb backtrace for the assertion failure (9.25 KB, text/plain)
2013-02-27 13:54 PST, Tom Honermann
Details

Note You need to log in before you can comment on or make changes to this bug.
Description Tom Honermann 2013-02-27 13:54:32 PST
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.
Comment 1 Tom Honermann 2013-02-27 21:56:38 PST
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.
Comment 2 Argyrios Kyrtzidis 2013-03-18 17:55:48 PDT
Fixed in r177336.