Skip to content

Commit f247b56

Browse files
committed
Fix crash when '^::' is used as a default template argument.
Also fixes an issue for which a qualified-id whose leading component is a splice could be interpreted as a dependent member expression. Closes issue llvm#35.
1 parent b6e7243 commit f247b56

File tree

3 files changed

+16
-2
lines changed

3 files changed

+16
-2
lines changed

clang/lib/Sema/SemaTemplate.cpp

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -754,11 +754,14 @@ Sema::ActOnDependentIdExpression(const CXXScopeSpec &SS,
754754

755755
// Check if the nested name specifier is an enum type.
756756
bool IsEnum = false;
757-
if (NestedNameSpecifier *NNS = SS.getScopeRep())
757+
bool HasLeadingSplice = false;
758+
if (NestedNameSpecifier *NNS = SS.getScopeRep()) {
758759
IsEnum = isa_and_nonnull<EnumType>(NNS->getAsType());
760+
HasLeadingSplice = NNS->getAsSpliceExpr();
761+
}
759762

760763
if (!MightBeCxx11UnevalField && !isAddressOfOperand && !IsEnum &&
761-
isa<CXXMethodDecl>(DC) &&
764+
!HasLeadingSplice && isa<CXXMethodDecl>(DC) &&
762765
cast<CXXMethodDecl>(DC)->isImplicitObjectMemberFunction()) {
763766
QualType ThisType = cast<CXXMethodDecl>(DC)->getThisType().getNonReferenceType();
764767

clang/lib/Sema/SemaTemplateInstantiate.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1838,6 +1838,8 @@ getPackSubstitutedTemplateArgument(Sema &S, TemplateArgument Arg) {
18381838
Decl *TemplateInstantiator::TransformDecl(SourceLocation Loc, Decl *D) {
18391839
if (!D)
18401840
return nullptr;
1841+
if (isa<TranslationUnitDecl>(D))
1842+
return D;
18411843

18421844
if (TemplateTemplateParmDecl *TTP = dyn_cast<TemplateTemplateParmDecl>(D)) {
18431845
if (TTP->getDepth() < TemplateArgs.getNumLevels()) {

clang/test/Reflection/lift-operator.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,3 +109,12 @@ constexpr info info_nonstructural = ^Nonstructural{42};
109109

110110
namespace ns {}
111111
constexpr info info_ns = ^ns;
112+
113+
// =======================================
114+
// bb_clang_p2996_issue_35_regression_test
115+
// =======================================
116+
117+
namespace bb_clang_p2996_issue_35_regression_test {
118+
template <auto R = ^::> class S {};
119+
S s;
120+
} // namespace bb_clang_p2996_issue_35_regression_test

0 commit comments

Comments
 (0)