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<FunctionType>(FD->getType());
}
AFT->getResultType().getAsStringInternal(Proto);
- fprintf(stderr, "\n%s", Proto.c_str());
+ fprintf(stderr, "%s", Proto.c_str());
if (!FD->getBody())
fprintf(stderr, ";\n");
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())
}
FunctionDecl *NewFD = new FunctionDecl(D.getIdentifierLoc(), II, R, SC,
+ D.getDeclSpec().isInlineSpecified(),
LastDeclarator);
// Merge the decl with the existing one if appropriate.
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; }
return cast<FunctionType>(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; }
/// function.
Decl *DeclChain;
- StorageClass SClass;
+ StorageClass SClass : 2;
+ bool IsInline : 1;
};