[cfe-dev] libclang , clang_Cursor_isAnonymous what is an anonymous declaration
cedlemo via cfe-dev
cfe-dev at lists.llvm.org
Thu Nov 12 09:52:55 PST 2015
When I use clang in order to parse the same file, I 'm not able to find
anonymous struct or union decl:
even if I use the anonymous examples of the documentation.
class MyASTConsumer : public clang::ASTConsumer
{
public:
MyASTConsumer() : clang::ASTConsumer() { }
virtual ~MyASTConsumer() { }
virtual void HandleTagDeclDefinition( clang::TagDecl * d)
{
if (d->isStruct())
std::cout << "struct" << std::endl;
if (d->isUnion())
std::cout << "union" << std::endl;
clang::RecordDecl *r; r = llvm::cast(d);
if( r->isAnonymousStructOrUnion() )
{
std::cout << "RecordDecl Anonymous : " << std::endl;
}
}
};
int main()
{
using clang::CompilerInstance;
using clang::TargetOptions;
using clang::TargetInfo;
using clang::FileEntry;
using clang::Token;
using clang::ASTContext;
using clang::ASTConsumer;
using clang::Parser;
using clang::DiagnosticOptions;
using clang::TextDiagnosticPrinter;
CompilerInstance ci;
DiagnosticOptions diagnosticOptions;
ci.createDiagnostics();
std::shared_ptrpto = std::make_shared();
pto->Triple = llvm::sys::getDefaultTargetTriple();
TargetInfo *pti = TargetInfo::CreateTargetInfo(ci.getDiagnostics(), pto);
ci.setTarget(pti);
ci.createFileManager();
ci.createSourceManager(ci.getFileManager());
ci.createPreprocessor(clang::TU_Complete);
ci.getPreprocessorOpts().UsePredefines = false;
MyASTConsumer *astConsumer = new MyASTConsumer();
ci.setASTConsumer(llvm::make_unique(*astConsumer));
ci.createASTContext();
const FileEntry *pFile = ci.getFileManager().getFile("record_decls.c");
clang::FileID id = ci.getSourceManager().createFileID(pFile,
clang::SourceLocation(), clang::SrcMgr::C_User);
ci.getSourceManager().setMainFileID(id);
ci.getDiagnosticClient().BeginSourceFile(ci.getLangOpts(),
&ci.getPreprocessor());
clang::ParseAST(ci.getPreprocessor(), astConsumer, ci.getASTContext());
ci.getDiagnosticClient().EndSourceFile();
return 0;
}
On 07/11/2015 14:18, cedlemo via cfe-dev wrote:
> I have some difficulties to understand what are anonymous structures
> declaration (or union) .
>
> From this link:
> http://clang.llvm.org/doxygen/classclang_1_1RecordDecl.html#ad2dd151523eecb8d15149cc0937c3dff
>
> this is an anonymous declaration
>
> union { int i; float f; };
>
> and not this
>
> union X { int i; float f; };
> union { int i; float f; } obj;
>
>
> But if I make some tests:
>
>
>
> #include <stdio.h>
> #include "clang-c/Index.h"
> /*
> compile with:
> clang -lclang -o anonymous_record_decl_check
> anonymous_record_decl_check.c
> */
> static enum CXChildVisitResult
> visitor(CXCursor cursor, CXCursor parent, CXClientData data)
> {
> CXSourceLocation loc;
> CXFile file;
> unsigned line;
> unsigned column;
> unsigned offset;
> if (clang_getCursorKind(cursor) == CXCursor_StructDecl)
> {
> printf("sentinel %d\n", __LINE__);
> loc = clang_getCursorLocation(cursor);
> clang_getSpellingLocation(loc,
> &file,
> &line,
> &column,
> &offset);
>
> printf("sentinel %d\n", __LINE__);
> printf("line: %d anon ? %d\n", line,
> clang_Cursor_isAnonymous(cursor));
> }
>
> if (clang_getCursorKind(cursor) == CXCursor_UnionDecl)
> {
> printf("sentinel %d\n", __LINE__);
> loc = clang_getCursorLocation(cursor);
> printf("sentinel %d\n", __LINE__);
> clang_getSpellingLocation(loc,
> &file,
> &line,
> &column,
> &offset);
> printf("line: %d anon ? %d\n", line,
> clang_Cursor_isAnonymous(cursor));
> }
> return CXChildVisit_Recurse; // visit complete AST recursivly
> }
>
> int main(int argc, char *argv[]) {
> CXIndex Index = clang_createIndex(0, 1);
> CXTranslationUnit TU = clang_createTranslationUnitFromSourceFile(Index,
> "record_decls.c",
> 0,
> 0,
> 0,
> 0);
>
> clang_visitChildren(clang_getTranslationUnitCursor(TU), visitor, 0);
>
> clang_disposeTranslationUnit(TU);
> clang_disposeIndex(Index);
> return 0;
> }
>
>
> with the file that is parsed ( record_decls.c ):
>
> struct { int a; char b; };
> struct tata { int c; double e;};
> union { int i; float f; };
> union X { int i; float f; };
>
>
>
> I have this output:
>
> sentinel 17
> sentinel 25
> line: 1 anon ? 0
> sentinel 17
> sentinel 25
> line: 2 anon ? 0
> sentinel 31
> sentinel 33
> line: 3 anon ? 0
> sentinel 31
> sentinel 33
> line: 4 anon ? 0
>
>
> Which means that all my declarations return the same value form
> clang_Cursor_isAnonymous
>
> Which means, well I don't really know, here is the comments from the
> headers:
>
> /**
> * \brief Determine whether the given cursor represents an anonymous
> record
> * declaration.
> */
>
> Any ideas?
>
>
> cedlemo
> _______________________________________________
> cfe-dev mailing list
> cfe-dev at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20151112/6648f157/attachment.html>
More information about the cfe-dev
mailing list