New patch version.
http://reviews.llvm.org/D3555
Files:
include/clang/Sema/Sema.h
lib/Parse/ParseTemplate.cpp
lib/Sema/SemaDeclCXX.cpp
test/Parser/DelayedTemplateParsing.cpp
Index: include/clang/Sema/Sema.h
===================================================================
--- include/clang/Sema/Sema.h
+++ include/clang/Sema/Sema.h
@@ -4884,8 +4884,8 @@
void ActOnFinishCXXMemberDecls();
void ActOnReenterCXXMethodParameter(Scope *S, ParmVarDecl *Param);
- void ActOnReenterTemplateScope(Scope *S, Decl *Template);
- void ActOnReenterDeclaratorTemplateScope(Scope *S, DeclaratorDecl *D);
+ void ActOnReenterTemplateScope(Scope *S, Decl *Template,
+ unsigned *NumParamLists = 0);
void ActOnStartDelayedMemberDeclarations(Scope *S, Decl *Record);
void ActOnStartDelayedCXXMethodDeclaration(Scope *S, Decl *Method);
void ActOnDelayedCXXMethodParameter(Scope *S, Decl *Param);
Index: lib/Parse/ParseTemplate.cpp
===================================================================
--- lib/Parse/ParseTemplate.cpp
+++ lib/Parse/ParseTemplate.cpp
@@ -1249,34 +1249,32 @@
SmallVectorImpl<DeclContext *>::reverse_iterator II =
DeclContextsToReenter.rbegin();
for (; II != DeclContextsToReenter.rend(); ++II) {
- if (ClassTemplatePartialSpecializationDecl *MD =
- dyn_cast_or_null<ClassTemplatePartialSpecializationDecl>(*II)) {
- TemplateParamScopeStack.push_back(
- new ParseScope(this, Scope::TemplateParamScope));
- Actions.ActOnReenterTemplateScope(getCurScope(), MD);
- ++CurTemplateDepthTracker;
- } else if (CXXRecordDecl *MD = dyn_cast_or_null<CXXRecordDecl>(*II)) {
- bool IsClassTemplate = MD->getDescribedClassTemplate() != 0;
- TemplateParamScopeStack.push_back(
- new ParseScope(this, Scope::TemplateParamScope,
- /*ManageScope*/IsClassTemplate));
- Actions.ActOnReenterTemplateScope(getCurScope(),
- MD->getDescribedClassTemplate());
- if (IsClassTemplate)
- ++CurTemplateDepthTracker;
+ if (Decl *D = dyn_cast<Decl>(*II)) {
+ TemplateParamScopeStack.push_back(new ParseScope(this,
+ Scope::TemplateParamScope));
+ unsigned NumParamLists = 0;
+ Actions.ActOnReenterTemplateScope(getCurScope(), D, &NumParamLists);
+ CurTemplateDepthTracker.addDepth(NumParamLists);
+
+ if (CXXRecordDecl *RD = dyn_cast<CXXRecordDecl>(D)) {
+ if (ClassTemplateDecl *CTD = RD->getDescribedClassTemplate()) {
+ TemplateParamScopeStack.push_back(new ParseScope(this,
+ Scope::TemplateParamScope));
+ unsigned NumParamLists = 0;
+ Actions.ActOnReenterTemplateScope(getCurScope(), CTD, &NumParamLists);
+ CurTemplateDepthTracker.addDepth(NumParamLists);
+ }
+ }
}
TemplateParamScopeStack.push_back(new ParseScope(this, Scope::DeclScope));
Actions.PushDeclContext(Actions.getCurScope(), *II);
}
TemplateParamScopeStack.push_back(
new ParseScope(this, Scope::TemplateParamScope));
- DeclaratorDecl *Declarator = dyn_cast<DeclaratorDecl>(FunD);
- const unsigned DeclaratorNumTemplateParameterLists =
- (Declarator ? Declarator->getNumTemplateParameterLists() : 0);
- if (Declarator && DeclaratorNumTemplateParameterLists != 0) {
- Actions.ActOnReenterDeclaratorTemplateScope(getCurScope(), Declarator);
- CurTemplateDepthTracker.addDepth(DeclaratorNumTemplateParameterLists);
+ if (unsigned NumLists = FunD->getNumTemplateParameterLists()) {
+ Actions.ActOnReenterTemplateScope(getCurScope(), FunD);
+ CurTemplateDepthTracker.addDepth(NumLists);
}
Actions.ActOnReenterTemplateScope(getCurScope(), LPT.D);
++CurTemplateDepthTracker;
Index: lib/Sema/SemaDeclCXX.cpp
===================================================================
--- lib/Sema/SemaDeclCXX.cpp
+++ lib/Sema/SemaDeclCXX.cpp
@@ -5980,45 +5980,38 @@
}
}
-void Sema::ActOnReenterDeclaratorTemplateScope(Scope *S, DeclaratorDecl *D) {
+void Sema::ActOnReenterTemplateScope(Scope *S, Decl *D,
+ unsigned *NumParamLists) {
if (!D)
return;
- int NumParamList = D->getNumTemplateParameterLists();
- for (int i = 0; i < NumParamList; i++) {
- TemplateParameterList* Params = D->getTemplateParameterList(i);
- for (TemplateParameterList::iterator Param = Params->begin(),
- ParamEnd = Params->end();
- Param != ParamEnd; ++Param) {
- NamedDecl *Named = cast<NamedDecl>(*Param);
- if (Named->getDeclName()) {
- S->AddDecl(Named);
- IdResolver.AddDecl(Named);
- }
- }
+ SmallVector<TemplateParameterList *, 4> ParameterLists;
+
+ if (TemplateDecl *TD = dyn_cast<TemplateDecl>(D))
+ ParameterLists.push_back(TD->getTemplateParameters());
+
+ if (auto *PSD = dyn_cast<ClassTemplatePartialSpecializationDecl>(D))
+ ParameterLists.push_back(PSD->getTemplateParameters());
+
+ if (DeclaratorDecl *DD = dyn_cast<DeclaratorDecl>(D)) {
+ for (unsigned i = 0; i < DD->getNumTemplateParameterLists(); ++i)
+ ParameterLists.push_back(DD->getTemplateParameterList(i));
}
-}
-void Sema::ActOnReenterTemplateScope(Scope *S, Decl *D) {
- if (!D)
- return;
-
- TemplateParameterList *Params = 0;
- if (TemplateDecl *Template = dyn_cast<TemplateDecl>(D))
- Params = Template->getTemplateParameters();
- else if (ClassTemplatePartialSpecializationDecl *PartialSpec
- = dyn_cast<ClassTemplatePartialSpecializationDecl>(D))
- Params = PartialSpec->getTemplateParameters();
- else
- return;
+ if (CXXRecordDecl *RD = dyn_cast<CXXRecordDecl>(D)) {
+ for (unsigned i = 0; i < RD->getNumTemplateParameterLists(); ++i)
+ ParameterLists.push_back(RD->getTemplateParameterList(i));
+ }
+
+ if (NumParamLists)
+ *NumParamLists = ParameterLists.size();
- for (TemplateParameterList::iterator Param = Params->begin(),
- ParamEnd = Params->end();
- Param != ParamEnd; ++Param) {
- NamedDecl *Named = cast<NamedDecl>(*Param);
- if (Named->getDeclName()) {
- S->AddDecl(Named);
- IdResolver.AddDecl(Named);
+ for (TemplateParameterList *Params : ParameterLists) {
+ for (NamedDecl *Param : *Params) {
+ if (Param->getDeclName()) {
+ S->AddDecl(Param);
+ IdResolver.AddDecl(Param);
+ }
}
}
}
Index: test/Parser/DelayedTemplateParsing.cpp
===================================================================
--- test/Parser/DelayedTemplateParsing.cpp
+++ test/Parser/DelayedTemplateParsing.cpp
@@ -123,3 +123,61 @@
template <typename T>
auto invalidTrailingRetType() -> Bogus {} // expected-error {{unknown type name 'Bogus'}}
+
+namespace PR19613 {
+
+struct HeapTypeConfig {
+ static void from_bitset();
+};
+
+template <class Config>
+struct TypeImpl {
+ struct BitsetType;
+
+ static void Any() {
+ BitsetType::New();
+ }
+};
+
+template<class Config>
+struct TypeImpl<Config>::BitsetType {
+ static void New() {
+ Config::from_bitset();
+ }
+};
+
+static void f() {
+ TypeImpl<HeapTypeConfig>::Any();
+}
+
+template<typename A> struct S {
+ template<typename B> struct T;
+};
+template<typename A> template<typename B> struct S<A>::T {
+ template<typename C, typename D> struct U;
+ template<typename C> struct U<C, C> {
+ template<typename E> static int f() {
+ return sizeof(A) + sizeof(B) + sizeof(C) + sizeof(E);
+ }
+ };
+};
+
+static void g() {
+ S<int>::T<int>::U<int,int>::f<int>();
+}
+
+template<typename T> struct SS {
+ template<typename U> struct X;
+ template<typename U> struct X<U*>;
+};
+template<typename T> template<typename U> struct SS<T>::X<U*> {
+ static int f() {
+ return sizeof(T) + sizeof(U);
+ }
+};
+
+static void h() {
+ SS<int>::X<int*>::f();
+}
+
+}
_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits