Add ThreadSpecified bit to Decl.

- Patch from Kevin Tew.

llvm-svn: 55940
This commit is contained in:
Daniel Dunbar 2008-09-08 20:05:47 +00:00
parent 3871441861
commit 1e6ff5f37f
2 changed files with 12 additions and 6 deletions

View File

@ -228,12 +228,14 @@ private:
Stmt *Init;
// FIXME: This can be packed into the bitfields in Decl.
unsigned SClass : 3;
bool ThreadSpecified : 1;
friend class StmtIteratorBase;
protected:
VarDecl(Kind DK, DeclContext *DC, SourceLocation L, IdentifierInfo *Id,
QualType T, StorageClass SC, ScopedDecl *PrevDecl)
: ValueDecl(DK, DC, L, Id, T, PrevDecl), Init(0) { SClass = SC; }
: ValueDecl(DK, DC, L, Id, T, PrevDecl), Init(0),
ThreadSpecified(false) { SClass = SC; }
public:
static VarDecl *Create(ASTContext &C, DeclContext *DC,
SourceLocation L, IdentifierInfo *Id,
@ -245,6 +247,11 @@ public:
Expr *getInit() { return (Expr*) Init; }
void setInit(Expr *I) { Init = (Stmt*) I; }
void setThreadSpecified(bool T) { ThreadSpecified = T; }
bool isThreadSpecified() const {
return ThreadSpecified;
}
/// hasLocalStorage - Returns true if a variable with function scope
/// is a non-static local variable.
bool hasLocalStorage() const {

View File

@ -743,6 +743,7 @@ Sema::ActOnDeclarator(Scope *S, Declarator &D, DeclTy *lastDecl) {
D.getIdentifierLoc(), II,
R, LastDeclarator);
} else {
bool ThreadSpecified = D.getDeclSpec().isThreadSpecified();
if (S->getFnParent() == 0) {
// C99 6.9p2: The storage-class specifiers auto and register shall not
// appear in the declaration specifiers in an external declaration.
@ -751,12 +752,10 @@ Sema::ActOnDeclarator(Scope *S, Declarator &D, DeclTy *lastDecl) {
R.getAsString());
InvalidDecl = true;
}
NewVD = VarDecl::Create(Context, CurContext, D.getIdentifierLoc(),
II, R, SC, LastDeclarator);
} else {
NewVD = VarDecl::Create(Context, CurContext, D.getIdentifierLoc(),
II, R, SC, LastDeclarator);
}
NewVD = VarDecl::Create(Context, CurContext, D.getIdentifierLoc(),
II, R, SC, LastDeclarator);
NewVD->setThreadSpecified(ThreadSpecified);
}
// Handle attributes prior to checking for duplicates in MergeVarDecl
ProcessDeclAttributes(NewVD, D);