From b677a9398ad0ba6edcc51bb4bd18cf72e94b8243 Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Sun, 26 Aug 2007 04:02:13 +0000 Subject: [PATCH] Make parse-ast-print print the storage class and inline specifier of functions. llvm-svn: 41416 --- clang/Driver/ASTStreamers.cpp | 14 +++++++++++++- clang/Sema/SemaDecl.cpp | 3 ++- clang/include/clang/AST/Decl.h | 8 +++++--- 3 files changed, 20 insertions(+), 5 deletions(-) diff --git a/clang/Driver/ASTStreamers.cpp b/clang/Driver/ASTStreamers.cpp index 3b6138ae3170..c819623f41e0 100644 --- a/clang/Driver/ASTStreamers.cpp +++ b/clang/Driver/ASTStreamers.cpp @@ -47,6 +47,18 @@ void clang::BuildASTs(Preprocessor &PP, unsigned MainFileID, bool Stats) { static void PrintFunctionDeclStart(FunctionDecl *FD) { bool HasBody = FD->getBody(); + fprintf(stderr, "\n"); + + switch (FD->getStorageClass()) { + default: assert(0 && "Unknown storage class"); + case FunctionDecl::None: break; + case FunctionDecl::Extern: fprintf(stderr, "extern "); break; + case FunctionDecl::Static: fprintf(stderr, "static "); break; + } + + if (FD->isInline()) + fprintf(stderr, "inline "); + std::string Proto = FD->getName(); FunctionType *AFT = cast(FD->getType()); @@ -72,7 +84,7 @@ static void PrintFunctionDeclStart(FunctionDecl *FD) { } AFT->getResultType().getAsStringInternal(Proto); - fprintf(stderr, "\n%s", Proto.c_str()); + fprintf(stderr, "%s", Proto.c_str()); if (!FD->getBody()) fprintf(stderr, ";\n"); diff --git a/clang/Sema/SemaDecl.cpp b/clang/Sema/SemaDecl.cpp index 46e5a108ca5d..faf016b94481 100644 --- a/clang/Sema/SemaDecl.cpp +++ b/clang/Sema/SemaDecl.cpp @@ -156,7 +156,7 @@ Decl *Sema::LazilyCreateBuiltin(IdentifierInfo *II, unsigned bid, Scope *S) { QualType R = Context.BuiltinInfo.GetBuiltinType(BID, Context); FunctionDecl *New = new FunctionDecl(SourceLocation(), II, R, - FunctionDecl::Extern, 0); + FunctionDecl::Extern, false, 0); // Find translation-unit scope to insert this function into. while (S->getParent()) @@ -334,6 +334,7 @@ Sema::ParseDeclarator(Scope *S, Declarator &D, ExprTy *init, } FunctionDecl *NewFD = new FunctionDecl(D.getIdentifierLoc(), II, R, SC, + D.getDeclSpec().isInlineSpecified(), LastDeclarator); // Merge the decl with the existing one if appropriate. diff --git a/clang/include/clang/AST/Decl.h b/clang/include/clang/AST/Decl.h index 58eb7230788f..ca07cbf9727a 100644 --- a/clang/include/clang/AST/Decl.h +++ b/clang/include/clang/AST/Decl.h @@ -239,9 +239,9 @@ public: None, Extern, Static }; FunctionDecl(SourceLocation L, IdentifierInfo *Id, QualType T, - StorageClass S = None, Decl *PrevDecl = 0) + StorageClass S = None, bool isInline, Decl *PrevDecl = 0) : ValueDecl(Function, L, Id, T, PrevDecl), - ParamInfo(0), Body(0), DeclChain(0), SClass(S) {} + ParamInfo(0), Body(0), DeclChain(0), SClass(S), IsInline(isInline) {} virtual ~FunctionDecl(); Stmt *getBody() const { return Body; } @@ -265,6 +265,7 @@ public: return cast(getType())->getResultType(); } StorageClass getStorageClass() const { return SClass; } + bool isInline() const { return IsInline; } // Implement isa/cast/dyncast/etc. static bool classof(const Decl *D) { return D->getKind() == Function; } @@ -282,7 +283,8 @@ private: /// function. Decl *DeclChain; - StorageClass SClass; + StorageClass SClass : 2; + bool IsInline : 1; };