forked from OSchip/llvm-project
Create function, block, and template parameters in the context of the
translation unit. This is temporary for function and block parameters; template parameters can just stay this way, since Templates aren't DeclContexts. This gives us the nice property that everything created in a record DC should have access in C++. llvm-svn: 94122
This commit is contained in:
parent
2687356105
commit
f7b2fb51d1
|
@ -418,8 +418,6 @@ void Decl::CheckAccessDeclContext() const {
|
|||
// FunctionDecl)
|
||||
// 4. the context is not a record
|
||||
if (isa<TranslationUnitDecl>(this) ||
|
||||
isTemplateParameter() ||
|
||||
isa<ParmVarDecl>(this) ||
|
||||
!isa<CXXRecordDecl>(getDeclContext()))
|
||||
return;
|
||||
|
||||
|
|
|
@ -2864,7 +2864,7 @@ Sema::ActOnFunctionDeclarator(Scope* S, Declarator& D, DeclContext* DC,
|
|||
// Synthesize a parameter for each argument type.
|
||||
for (FunctionProtoType::arg_type_iterator AI = FT->arg_type_begin(),
|
||||
AE = FT->arg_type_end(); AI != AE; ++AI) {
|
||||
ParmVarDecl *Param = ParmVarDecl::Create(Context, DC,
|
||||
ParmVarDecl *Param = ParmVarDecl::Create(Context, NewFD,
|
||||
SourceLocation(), 0,
|
||||
*AI, /*TInfo=*/0,
|
||||
VarDecl::None, 0);
|
||||
|
@ -3862,8 +3862,13 @@ Sema::ActOnParamDeclarator(Scope *S, Declarator &D) {
|
|||
|
||||
QualType T = adjustParameterType(parmDeclType);
|
||||
|
||||
// Temporarily put parameter variables in the translation unit, not
|
||||
// the enclosing context. This prevents them from accidentally
|
||||
// looking like class members in C++.
|
||||
DeclContext *DC = Context.getTranslationUnitDecl();
|
||||
|
||||
ParmVarDecl *New
|
||||
= ParmVarDecl::Create(Context, CurContext, D.getIdentifierLoc(), II,
|
||||
= ParmVarDecl::Create(Context, DC, D.getIdentifierLoc(), II,
|
||||
T, TInfo, StorageClass, 0);
|
||||
|
||||
if (D.isInvalidType())
|
||||
|
|
|
@ -6801,10 +6801,13 @@ void Sema::ActOnBlockArguments(Declarator &ParamInfo, Scope *CurScope) {
|
|||
CurBlock->TheDecl->setIsVariadic(CurBlock->isVariadic);
|
||||
ProcessDeclAttributes(CurScope, CurBlock->TheDecl, ParamInfo);
|
||||
for (BlockDecl::param_iterator AI = CurBlock->TheDecl->param_begin(),
|
||||
E = CurBlock->TheDecl->param_end(); AI != E; ++AI)
|
||||
E = CurBlock->TheDecl->param_end(); AI != E; ++AI) {
|
||||
(*AI)->setOwningFunction(CurBlock->TheDecl);
|
||||
|
||||
// If this has an identifier, add it to the scope stack.
|
||||
if ((*AI)->getIdentifier())
|
||||
PushOnScopeChains(*AI, CurBlock->TheScope);
|
||||
}
|
||||
|
||||
// Check for a valid sentinel attribute on this block.
|
||||
if (!CurBlock->isVariadic &&
|
||||
|
|
|
@ -449,8 +449,8 @@ Sema::DeclPtrTy Sema::ActOnTypeParameter(Scope *S, bool Typename, bool Ellipsis,
|
|||
Loc = KeyLoc;
|
||||
|
||||
TemplateTypeParmDecl *Param
|
||||
= TemplateTypeParmDecl::Create(Context, CurContext, Loc,
|
||||
Depth, Position, ParamName, Typename,
|
||||
= TemplateTypeParmDecl::Create(Context, Context.getTranslationUnitDecl(),
|
||||
Loc, Depth, Position, ParamName, Typename,
|
||||
Ellipsis);
|
||||
if (Invalid)
|
||||
Param->setInvalidDecl();
|
||||
|
@ -572,7 +572,8 @@ Sema::DeclPtrTy Sema::ActOnNonTypeTemplateParameter(Scope *S, Declarator &D,
|
|||
}
|
||||
|
||||
NonTypeTemplateParmDecl *Param
|
||||
= NonTypeTemplateParmDecl::Create(Context, CurContext, D.getIdentifierLoc(),
|
||||
= NonTypeTemplateParmDecl::Create(Context, Context.getTranslationUnitDecl(),
|
||||
D.getIdentifierLoc(),
|
||||
Depth, Position, ParamName, T, TInfo);
|
||||
if (Invalid)
|
||||
Param->setInvalidDecl();
|
||||
|
@ -625,8 +626,8 @@ Sema::DeclPtrTy Sema::ActOnTemplateTemplateParameter(Scope* S,
|
|||
|
||||
// Construct the parameter object.
|
||||
TemplateTemplateParmDecl *Param =
|
||||
TemplateTemplateParmDecl::Create(Context, CurContext, TmpLoc, Depth,
|
||||
Position, Name,
|
||||
TemplateTemplateParmDecl::Create(Context, Context.getTranslationUnitDecl(),
|
||||
TmpLoc, Depth, Position, Name,
|
||||
(TemplateParameterList*)Params);
|
||||
|
||||
// Make sure the parameter is valid.
|
||||
|
|
|
@ -1012,7 +1012,9 @@ ParmVarDecl *TemplateDeclInstantiator::VisitParmVarDecl(ParmVarDecl *D) {
|
|||
|
||||
// Allocate the parameter
|
||||
ParmVarDecl *Param
|
||||
= ParmVarDecl::Create(SemaRef.Context, Owner, D->getLocation(),
|
||||
= ParmVarDecl::Create(SemaRef.Context,
|
||||
SemaRef.Context.getTranslationUnitDecl(),
|
||||
D->getLocation(),
|
||||
D->getIdentifier(), T, DI, D->getStorageClass(), 0);
|
||||
|
||||
// Mark the default argument as being uninstantiated.
|
||||
|
|
Loading…
Reference in New Issue