diff options
author | Caitlin Sadowski <supertri@google.com> | 2011-09-08 17:42:31 +0000 |
---|---|---|
committer | Caitlin Sadowski <supertri@google.com> | 2011-09-08 17:42:31 +0000 |
commit | ed9d84a2112e2bd56befb5f4fa8fc5bdf71fafa3 (patch) | |
tree | cc1d430044e599baf8afacd324275b752b526383 /lib/Parse/ParseDecl.cpp | |
parent | eff98fc3561f6b717f6348f04b3f4fe03e934466 (diff) |
Thread safety: added support for function scopes in attribute arguments.
This patch was written by DeLesley Hutchins.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@139302 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Parse/ParseDecl.cpp')
-rw-r--r-- | lib/Parse/ParseDecl.cpp | 20 |
1 files changed, 20 insertions, 0 deletions
diff --git a/lib/Parse/ParseDecl.cpp b/lib/Parse/ParseDecl.cpp index 1f9f85bab7..c5cedeafbb 100644 --- a/lib/Parse/ParseDecl.cpp +++ b/lib/Parse/ParseDecl.cpp @@ -759,8 +759,28 @@ void Parser::ParseLexedAttribute(LateParsedAttribute &LA) { ParsedAttributes Attrs(AttrFactory); SourceLocation endLoc; + // If the Decl is templatized, add template parameters to scope. + bool HasTemplateScope = LA.D && LA.D->isTemplateDecl(); + ParseScope TempScope(this, Scope::TemplateParamScope, HasTemplateScope); + if (HasTemplateScope) + Actions.ActOnReenterTemplateScope(Actions.CurScope, LA.D); + + // If the Decl is on a function, add function parameters to the scope. + bool HasFunctionScope = LA.D && LA.D->isFunctionOrFunctionTemplate(); + ParseScope FnScope(this, Scope::FnScope|Scope::DeclScope, HasFunctionScope); + if (HasFunctionScope) + Actions.ActOnReenterFunctionContext(Actions.CurScope, LA.D); + ParseGNUAttributeArgs(&LA.AttrName, LA.AttrNameLoc, Attrs, &endLoc); + if (HasFunctionScope) { + Actions.ActOnExitFunctionContext(); + FnScope.Exit(); // Pop scope, and remove Decls from IdResolver + } + if (HasTemplateScope) { + TempScope.Exit(); + } + // Late parsed attributes must be attached to Decls by hand. If the // LA.D is not set, then this was not done properly. assert(LA.D && "No decl attached to late parsed attribute"); |