Fix the storage class of method instantiations.
We keep the "as written" storage class, but that is a fuzzy concept for instantiations. With this patch instantiations of methods of class templates now get a storage class that is based on the semantics of isStatic(). With this can simplify isStatic() itself. llvm-svn: 179521
This commit is contained in:
parent
b23ea72e48
commit
29cda59a9d
|
@ -1258,20 +1258,7 @@ bool CXXRecordDecl::mayBeAbstract() const {
|
|||
void CXXMethodDecl::anchor() { }
|
||||
|
||||
bool CXXMethodDecl::isStatic() const {
|
||||
const CXXMethodDecl *MD = this;
|
||||
for (;;) {
|
||||
const CXXMethodDecl *C = MD->getCanonicalDecl();
|
||||
if (C != MD) {
|
||||
MD = C;
|
||||
continue;
|
||||
}
|
||||
|
||||
FunctionTemplateSpecializationInfo *Info =
|
||||
MD->getTemplateSpecializationInfo();
|
||||
if (!Info)
|
||||
break;
|
||||
MD = cast<CXXMethodDecl>(Info->getTemplate()->getTemplatedDecl());
|
||||
}
|
||||
const CXXMethodDecl *MD = getCanonicalDecl();
|
||||
|
||||
if (MD->getStorageClass() == SC_Static)
|
||||
return true;
|
||||
|
|
|
@ -1530,10 +1530,10 @@ TemplateDeclInstantiator::VisitCXXMethodDecl(CXXMethodDecl *D,
|
|||
Conversion->isConstexpr(),
|
||||
Conversion->getLocEnd());
|
||||
} else {
|
||||
StorageClass SC = D->isStatic() ? SC_Static : SC_None;
|
||||
Method = CXXMethodDecl::Create(SemaRef.Context, Record,
|
||||
StartLoc, NameInfo, T, TInfo,
|
||||
D->getStorageClass(),
|
||||
D->isInlineSpecified(),
|
||||
SC, D->isInlineSpecified(),
|
||||
D->isConstexpr(), D->getLocEnd());
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue