diff options
-rw-r--r-- | include/clang/AST/Decl.h | 9 | ||||
-rw-r--r-- | lib/Sema/SemaDecl.cpp | 9 |
2 files changed, 12 insertions, 6 deletions
diff --git a/include/clang/AST/Decl.h b/include/clang/AST/Decl.h index a13f0532da..29ec40b6e2 100644 --- a/include/clang/AST/Decl.h +++ b/include/clang/AST/Decl.h @@ -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 { diff --git a/lib/Sema/SemaDecl.cpp b/lib/Sema/SemaDecl.cpp index 75fcc5173e..cf84bcc5e1 100644 --- a/lib/Sema/SemaDecl.cpp +++ b/lib/Sema/SemaDecl.cpp @@ -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); |