[cfe-dev] LangOpts && "Unexpected diagnostic outside source file processing" failed.
Alberto Magni
alberto.magni86 at gmail.com
Fri Sep 17 02:17:02 PDT 2010
Thank you very much Eli,
I'll follow the code in the examples.
2010/9/17 Eli Friedman <eli.friedman at gmail.com>
> On Thu, Sep 16, 2010 at 2:27 PM, Alberto Magni
> <alberto.magni86 at gmail.com> wrote:
> > Hi everybody,
> >
> > I am new to clang and I am trying to learn it going through this
> tutorial:
> > http://www.cs.rpi.edu/~laprej/clang.html<http://www.cs.rpi.edu/%7Elaprej/clang.html>
> > I have a very basic problem though. After some work I ended up to this
> > piece of code:
> >
> > int main(int argc, char** argv)
> > {
> > FileManager* fileManager = new FileManager();
> > LangOptions* languageOptions = new LangOptions();
> > languageOptions->BCPLComment=1;
> > languageOptions->C99=1;
> > DiagnosticOptions* diagnosticOptions=new DiagnosticOptions();
> > llvm::raw_os_ostream os(cout);
> > TextDiagnosticPrinter* diagnosticClient=new
> > TextDiagnosticPrinter(os,*diagnosticOptions,true);
> > Diagnostic* diagnostic = new Diagnostic(diagnosticClient);
> > SourceManager* sourceManager= new SourceManager(*diagnostic);
> > HeaderSearch* headerSearch = new HeaderSearch(*fileManager);
> > TargetOptions targetOptions;
> > targetOptions.Triple=LLVM_HOSTTRIPLE;
> > TargetInfo *targetInfo = TargetInfo::CreateTargetInfo (*diagnostic,
> > targetOptions);
> > Preprocessor* preprocessor = new Preprocessor(*diagnostic,
> > *languageOptions, *targetInfo, *sourceManager, *headerSearch);
> > const FileEntry* fileEntry=fileManager->getFile("test.c");
> > sourceManager->createMainFileID(fileEntry);
> > preprocessor->EnterMainSourceFile();
> > Token token;
> > do
> > {
> > preprocessor->Lex(token);
> > if(diagnostic->hasErrorOccurred())
> > {
> > break;
> > }
> > preprocessor->DumpToken(token);
> > std::cerr << std::endl;
> > }
> > while(token.isNot(tok::eof));
> > diagnosticClient->EndSourceFile();
> > return 0;
> > }
> >
> > This works well with input files with not errors or no warnings.
> >
> > Then I give as input this very minimalistic file (test.c):
> >
> > int main() {
> > /* Nested /* comments */
> > }
> >
> > The parsing of this code should produce a warning for the presence of the
> > nested comment, but instead I get this output:
> >
> > int 'int'
> > identifier 'main'
> > l_paren '('
> > r_paren ')'
> > l_brace '{'
> > clangExample: TextDiagnosticPrinter.cpp:298: void
> > clang::TextDiagnosticPrinter::EmitCaretDiagnostic(clang::SourceLocation,
> > clang::CharSourceRange*, unsigned int, const clang::SourceManager&, const
> > clang::FixItHint*, unsigned int, unsigned int, unsigned int, unsigned
> int,
> > unsigned int): Assertion `LangOpts && "Unexpected diagnostic outside
> source
> > file processing"' failed.
> >
> > The problem is that the preprocessor tries to output the diagnostic
> message
> > outside the right context. I also tried to call the
> > diagnosticClient->BeginSourceFile function before the parsing of the file
> > but no warning is displayed either, the parsing is stopped with no
> messages
> > at all.
> >
> > I also tried the CompilerInstance/CompilerInvocation approach with the
> same
> > result.
> >
> > How can I fix this issue? Where am I wrong ?
> >
> > Any help is greatly appreciated.
>
> Your initialization code is probably wrong somehow, but these sorts of
> errors can be difficult to precisely locate. Please use use the
> frontend infrastructure like the example in
> examples/clang-interpreter/ does, and inherit from
> PreprocessorFrontendAction to build your own action similar to
> DumpRawTokensAction in lib/Frontend/FrontendActions.cpp.
>
> -Eli
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20100917/7774f94c/attachment.html>
More information about the cfe-dev
mailing list