forked from OSchip/llvm-project
Make sure to adjust function template declarations to their templated
declarations (e.g., FunctionTemplateDecl -> CXXConstructorDecl) before performing semantic analysis on the declarations. Fixes PR4761. llvm-svn: 79911
This commit is contained in:
parent
582d61026d
commit
c8c277a1b3
|
@ -174,7 +174,7 @@ void Parser::ParseLexedMethodDefs(ParsingClass &Class) {
|
|||
// Append the current token at the end of the new token stream so that it
|
||||
// doesn't get lost.
|
||||
LM.Toks.push_back(Tok);
|
||||
PP.EnterTokenStream(&LM.Toks.front(), LM.Toks.size(), true, false);
|
||||
PP.EnterTokenStream(LM.Toks.data(), LM.Toks.size(), true, false);
|
||||
|
||||
// Consume the previously pushed token.
|
||||
ConsumeAnyToken();
|
||||
|
|
|
@ -703,6 +703,8 @@ Sema::ActOnMemInitializer(DeclPtrTy ConstructorD,
|
|||
if (!ConstructorD)
|
||||
return true;
|
||||
|
||||
AdjustDeclIfTemplate(ConstructorD);
|
||||
|
||||
CXXConstructorDecl *Constructor
|
||||
= dyn_cast<CXXConstructorDecl>(ConstructorD.getAs<Decl>());
|
||||
if (!Constructor) {
|
||||
|
@ -922,6 +924,8 @@ void Sema::ActOnMemInitializers(DeclPtrTy ConstructorDecl,
|
|||
MemInitTy **MemInits, unsigned NumMemInits) {
|
||||
if (!ConstructorDecl)
|
||||
return;
|
||||
|
||||
AdjustDeclIfTemplate(ConstructorDecl);
|
||||
|
||||
CXXConstructorDecl *Constructor
|
||||
= dyn_cast<CXXConstructorDecl>(ConstructorDecl.getAs<Decl>());
|
||||
|
@ -1041,6 +1045,8 @@ void Sema::ActOnDefaultCtorInitializers(DeclPtrTy CDtorDecl) {
|
|||
if (!CDtorDecl)
|
||||
return;
|
||||
|
||||
AdjustDeclIfTemplate(CDtorDecl);
|
||||
|
||||
if (CXXConstructorDecl *Constructor
|
||||
= dyn_cast<CXXConstructorDecl>(CDtorDecl.getAs<Decl>()))
|
||||
BuildBaseOrMemberInitializers(Context,
|
||||
|
@ -1529,6 +1535,8 @@ void Sema::ActOnStartDelayedCXXMethodDeclaration(Scope *S, DeclPtrTy MethodD) {
|
|||
if (!MethodD)
|
||||
return;
|
||||
|
||||
AdjustDeclIfTemplate(MethodD);
|
||||
|
||||
CXXScopeSpec SS;
|
||||
FunctionDecl *Method = cast<FunctionDecl>(MethodD.getAs<Decl>());
|
||||
QualType ClassTy
|
||||
|
@ -1569,6 +1577,8 @@ void Sema::ActOnFinishDelayedCXXMethodDeclaration(Scope *S, DeclPtrTy MethodD) {
|
|||
if (!MethodD)
|
||||
return;
|
||||
|
||||
AdjustDeclIfTemplate(MethodD);
|
||||
|
||||
FunctionDecl *Method = cast<FunctionDecl>(MethodD.getAs<Decl>());
|
||||
CXXScopeSpec SS;
|
||||
QualType ClassTy
|
||||
|
@ -3648,6 +3658,8 @@ Sema::DeclPtrTy Sema::ActOnFriendDecl(Scope *S,
|
|||
}
|
||||
|
||||
void Sema::SetDeclDeleted(DeclPtrTy dcl, SourceLocation DelLoc) {
|
||||
AdjustDeclIfTemplate(dcl);
|
||||
|
||||
Decl *Dcl = dcl.getAs<Decl>();
|
||||
FunctionDecl *Fn = dyn_cast<FunctionDecl>(Dcl);
|
||||
if (!Fn) {
|
||||
|
@ -3782,6 +3794,8 @@ bool Sema::CheckOverridingFunctionExceptionSpec(const CXXMethodDecl *New,
|
|||
/// static data member of class X, names should be looked up in the scope of
|
||||
/// class X.
|
||||
void Sema::ActOnCXXEnterDeclInitializer(Scope *S, DeclPtrTy Dcl) {
|
||||
AdjustDeclIfTemplate(Dcl);
|
||||
|
||||
Decl *D = Dcl.getAs<Decl>();
|
||||
// If there is no declaration, there was an error parsing it.
|
||||
if (D == 0)
|
||||
|
@ -3805,6 +3819,8 @@ void Sema::ActOnCXXEnterDeclInitializer(Scope *S, DeclPtrTy Dcl) {
|
|||
/// ActOnCXXExitDeclInitializer - Invoked after we are finished parsing an
|
||||
/// initializer for the declaration 'Dcl'.
|
||||
void Sema::ActOnCXXExitDeclInitializer(Scope *S, DeclPtrTy Dcl) {
|
||||
AdjustDeclIfTemplate(Dcl);
|
||||
|
||||
Decl *D = Dcl.getAs<Decl>();
|
||||
// If there is no declaration, there was an error parsing it.
|
||||
if (D == 0)
|
||||
|
|
|
@ -4,6 +4,10 @@ struct X0 { // expected-note{{candidate}}
|
|||
X0(int); // expected-note{{candidate}}
|
||||
template<typename T> X0(T);
|
||||
template<typename T, typename U> X0(T*, U*);
|
||||
|
||||
// PR4761
|
||||
template<typename T> X0() : f0(T::foo) {}
|
||||
int f0;
|
||||
};
|
||||
|
||||
void accept_X0(X0);
|
||||
|
|
Loading…
Reference in New Issue