Revert "[Concepts] Requires Expressions"
This reverts commit 027931899763409e2c61a84bdee6057b5e838ffa.
There have been some failing tests on some platforms, reverting while investigating.
diff --git a/clang/lib/Sema/Sema.cpp b/clang/lib/Sema/Sema.cpp
index f8da1cb..2cd158a 100644
--- a/clang/lib/Sema/Sema.cpp
+++ b/clang/lib/Sema/Sema.cpp
@@ -1261,8 +1261,7 @@
DeclContext *DC = CurContext;
while (true) {
- if (isa<BlockDecl>(DC) || isa<EnumDecl>(DC) || isa<CapturedDecl>(DC) ||
- isa<RequiresExprBodyDecl>(DC)) {
+ if (isa<BlockDecl>(DC) || isa<EnumDecl>(DC) || isa<CapturedDecl>(DC)) {
DC = DC->getParent();
} else if (isa<CXXMethodDecl>(DC) &&
cast<CXXMethodDecl>(DC)->getOverloadedOperator() == OO_Call &&
diff --git a/clang/lib/Sema/SemaConcept.cpp b/clang/lib/Sema/SemaConcept.cpp
index a5f5057..018ac2d 100755
--- a/clang/lib/Sema/SemaConcept.cpp
+++ b/clang/lib/Sema/SemaConcept.cpp
@@ -17,10 +17,7 @@
#include "clang/Sema/SemaDiagnostic.h"
#include "clang/Sema/TemplateDeduction.h"
#include "clang/Sema/Template.h"
-#include "clang/Sema/Overload.h"
-#include "clang/Sema/Initialization.h"
-#include "clang/Sema/SemaInternal.h"
-#include "clang/AST/ExprConcepts.h"
+#include "clang/AST/ExprCXX.h"
#include "clang/AST/RecursiveASTVisitor.h"
#include "clang/Basic/OperatorPrecedence.h"
#include "llvm/ADT/DenseMap.h"
@@ -339,118 +336,6 @@
return false;
}
-static void diagnoseUnsatisfiedRequirement(Sema &S,
- concepts::ExprRequirement *Req,
- bool First) {
- assert(!Req->isSatisfied()
- && "Diagnose() can only be used on an unsatisfied requirement");
- switch (Req->getSatisfactionStatus()) {
- case concepts::ExprRequirement::SS_Dependent:
- llvm_unreachable("Diagnosing a dependent requirement");
- break;
- case concepts::ExprRequirement::SS_ExprSubstitutionFailure: {
- auto *SubstDiag = Req->getExprSubstitutionDiagnostic();
- if (!SubstDiag->DiagMessage.empty())
- S.Diag(SubstDiag->DiagLoc,
- diag::note_expr_requirement_expr_substitution_error)
- << (int)First << SubstDiag->SubstitutedEntity
- << SubstDiag->DiagMessage;
- else
- S.Diag(SubstDiag->DiagLoc,
- diag::note_expr_requirement_expr_unknown_substitution_error)
- << (int)First << SubstDiag->SubstitutedEntity;
- break;
- }
- case concepts::ExprRequirement::SS_NoexceptNotMet:
- S.Diag(Req->getNoexceptLoc(),
- diag::note_expr_requirement_noexcept_not_met)
- << (int)First << Req->getExpr();
- break;
- case concepts::ExprRequirement::SS_TypeRequirementSubstitutionFailure: {
- auto *SubstDiag =
- Req->getReturnTypeRequirement().getSubstitutionDiagnostic();
- if (!SubstDiag->DiagMessage.empty())
- S.Diag(SubstDiag->DiagLoc,
- diag::note_expr_requirement_type_requirement_substitution_error)
- << (int)First << SubstDiag->SubstitutedEntity
- << SubstDiag->DiagMessage;
- else
- S.Diag(SubstDiag->DiagLoc,
- diag::note_expr_requirement_type_requirement_unknown_substitution_error)
- << (int)First << SubstDiag->SubstitutedEntity;
- break;
- }
- case concepts::ExprRequirement::SS_ConstraintsNotSatisfied: {
- ConceptSpecializationExpr *ConstraintExpr =
- Req->getReturnTypeRequirementSubstitutedConstraintExpr();
- if (ConstraintExpr->getTemplateArgsAsWritten()->NumTemplateArgs == 1)
- // A simple case - expr type is the type being constrained and the concept
- // was not provided arguments.
- S.Diag(ConstraintExpr->getBeginLoc(),
- diag::note_expr_requirement_constraints_not_satisfied_simple)
- << (int)First << S.BuildDecltypeType(Req->getExpr(),
- Req->getExpr()->getBeginLoc())
- << ConstraintExpr->getNamedConcept();
- else
- S.Diag(ConstraintExpr->getBeginLoc(),
- diag::note_expr_requirement_constraints_not_satisfied)
- << (int)First << ConstraintExpr;
- S.DiagnoseUnsatisfiedConstraint(ConstraintExpr->getSatisfaction());
- break;
- }
- case concepts::ExprRequirement::SS_Satisfied:
- llvm_unreachable("We checked this above");
- }
-}
-
-static void diagnoseUnsatisfiedRequirement(Sema &S,
- concepts::TypeRequirement *Req,
- bool First) {
- assert(!Req->isSatisfied()
- && "Diagnose() can only be used on an unsatisfied requirement");
- switch (Req->getSatisfactionStatus()) {
- case concepts::TypeRequirement::SS_Dependent:
- llvm_unreachable("Diagnosing a dependent requirement");
- return;
- case concepts::TypeRequirement::SS_SubstitutionFailure: {
- auto *SubstDiag = Req->getSubstitutionDiagnostic();
- if (!SubstDiag->DiagMessage.empty())
- S.Diag(SubstDiag->DiagLoc,
- diag::note_type_requirement_substitution_error) << (int)First
- << SubstDiag->SubstitutedEntity << SubstDiag->DiagMessage;
- else
- S.Diag(SubstDiag->DiagLoc,
- diag::note_type_requirement_unknown_substitution_error)
- << (int)First << SubstDiag->SubstitutedEntity;
- return;
- }
- default:
- llvm_unreachable("Unknown satisfaction status");
- return;
- }
-}
-
-static void diagnoseUnsatisfiedRequirement(Sema &S,
- concepts::NestedRequirement *Req,
- bool First) {
- if (Req->isSubstitutionFailure()) {
- concepts::Requirement::SubstitutionDiagnostic *SubstDiag =
- Req->getSubstitutionDiagnostic();
- if (!SubstDiag->DiagMessage.empty())
- S.Diag(SubstDiag->DiagLoc,
- diag::note_nested_requirement_substitution_error)
- << (int)First << SubstDiag->SubstitutedEntity
- << SubstDiag->DiagMessage;
- else
- S.Diag(SubstDiag->DiagLoc,
- diag::note_nested_requirement_unknown_substitution_error)
- << (int)First << SubstDiag->SubstitutedEntity;
- return;
- }
- S.DiagnoseUnsatisfiedConstraint(Req->getConstraintSatisfaction(), First);
-}
-
-
static void diagnoseWellFormedUnsatisfiedConstraintExpr(Sema &S,
Expr *SubstExpr,
bool First = true) {
@@ -527,19 +412,6 @@
}
S.DiagnoseUnsatisfiedConstraint(CSE->getSatisfaction());
return;
- } else if (auto *RE = dyn_cast<RequiresExpr>(SubstExpr)) {
- for (concepts::Requirement *Req : RE->getRequirements())
- if (!Req->isDependent() && !Req->isSatisfied()) {
- if (auto *E = dyn_cast<concepts::ExprRequirement>(Req))
- diagnoseUnsatisfiedRequirement(S, E, First);
- else if (auto *T = dyn_cast<concepts::TypeRequirement>(Req))
- diagnoseUnsatisfiedRequirement(S, T, First);
- else
- diagnoseUnsatisfiedRequirement(
- S, cast<concepts::NestedRequirement>(Req), First);
- break;
- }
- return;
}
S.Diag(SubstExpr->getSourceRange().getBegin(),
@@ -562,11 +434,11 @@
Record.template get<Expr *>(), First);
}
-void
-Sema::DiagnoseUnsatisfiedConstraint(const ConstraintSatisfaction& Satisfaction,
- bool First) {
+void Sema::DiagnoseUnsatisfiedConstraint(
+ const ConstraintSatisfaction& Satisfaction) {
assert(!Satisfaction.IsSatisfied &&
"Attempted to diagnose a satisfied constraint");
+ bool First = true;
for (auto &Pair : Satisfaction.Details) {
diagnoseUnsatisfiedConstraintExpr(*this, Pair.first, Pair.second, First);
First = false;
@@ -574,10 +446,10 @@
}
void Sema::DiagnoseUnsatisfiedConstraint(
- const ASTConstraintSatisfaction &Satisfaction,
- bool First) {
+ const ASTConstraintSatisfaction &Satisfaction) {
assert(!Satisfaction.IsSatisfied &&
"Attempted to diagnose a satisfied constraint");
+ bool First = true;
for (auto &Pair : Satisfaction) {
diagnoseUnsatisfiedConstraintExpr(*this, Pair.first, Pair.second, First);
First = false;
@@ -954,70 +826,3 @@
<< AmbiguousAtomic2->getSourceRange();
return true;
}
-
-concepts::ExprRequirement::ExprRequirement(
- Expr *E, bool IsSimple, SourceLocation NoexceptLoc,
- ReturnTypeRequirement Req, SatisfactionStatus Status,
- ConceptSpecializationExpr *SubstitutedConstraintExpr) :
- Requirement(IsSimple ? RK_Simple : RK_Compound, Status == SS_Dependent,
- Status == SS_Dependent &&
- (E->containsUnexpandedParameterPack() ||
- Req.containsUnexpandedParameterPack()),
- Status == SS_Satisfied), Value(E), NoexceptLoc(NoexceptLoc),
- TypeReq(Req), SubstitutedConstraintExpr(SubstitutedConstraintExpr),
- Status(Status) {
- assert((!IsSimple || (Req.isEmpty() && NoexceptLoc.isInvalid())) &&
- "Simple requirement must not have a return type requirement or a "
- "noexcept specification");
- assert((Status > SS_TypeRequirementSubstitutionFailure && Req.isTypeConstraint()) ==
- (SubstitutedConstraintExpr != nullptr));
-}
-
-concepts::ExprRequirement::ExprRequirement(
- SubstitutionDiagnostic *ExprSubstDiag, bool IsSimple,
- SourceLocation NoexceptLoc, ReturnTypeRequirement Req) :
- Requirement(IsSimple ? RK_Simple : RK_Compound, Req.isDependent(),
- Req.containsUnexpandedParameterPack(), /*IsSatisfied=*/false),
- Value(ExprSubstDiag), NoexceptLoc(NoexceptLoc), TypeReq(Req),
- Status(SS_ExprSubstitutionFailure) {
- assert((!IsSimple || (Req.isEmpty() && NoexceptLoc.isInvalid())) &&
- "Simple requirement must not have a return type requirement or a "
- "noexcept specification");
-}
-
-concepts::ExprRequirement::ReturnTypeRequirement::
-ReturnTypeRequirement(TemplateParameterList *TPL) :
- TypeConstraintInfo(TPL, 0) {
- assert(TPL->size() == 1);
- const TypeConstraint *TC =
- cast<TemplateTypeParmDecl>(TPL->getParam(0))->getTypeConstraint();
- assert(TC &&
- "TPL must have a template type parameter with a type constraint");
- auto *Constraint =
- cast_or_null<ConceptSpecializationExpr>(
- TC->getImmediatelyDeclaredConstraint());
- bool ContainsUnexpandedParameterPack =
- Constraint->containsUnexpandedParameterPack();
- bool Dependent = false;
- if (Constraint->getTemplateArgsAsWritten()) {
- for (auto &ArgLoc :
- Constraint->getTemplateArgsAsWritten()->arguments().drop_front(1)) {
- if (ArgLoc.getArgument().isDependent()) {
- Dependent = true;
- break;
- }
- }
- }
- TypeConstraintInfo.setInt((Dependent ? 1 : 0) |
- (ContainsUnexpandedParameterPack ? 2 : 0));
-}
-
-concepts::TypeRequirement::TypeRequirement(TypeSourceInfo *T) :
- Requirement(RK_Type, T->getType()->isDependentType(),
- T->getType()->containsUnexpandedParameterPack(),
- // We reach this ctor with either dependent types (in which
- // IsSatisfied doesn't matter) or with non-dependent type in
- // which the existence of the type indicates satisfaction.
- /*IsSatisfied=*/true
- ), Value(T),
- Status(T->getType()->isDependentType() ? SS_Dependent : SS_Satisfied) {}
diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp
index 372f3d1..507e4a6 100644
--- a/clang/lib/Sema/SemaDecl.cpp
+++ b/clang/lib/Sema/SemaDecl.cpp
@@ -6468,8 +6468,6 @@
return true;
if (DC->isRecord())
return false;
- if (isa<RequiresExprBodyDecl>(DC))
- return false;
llvm_unreachable("Unexpected context");
}
diff --git a/clang/lib/Sema/SemaExceptionSpec.cpp b/clang/lib/Sema/SemaExceptionSpec.cpp
index 193eaa3..5aedbe7 100644
--- a/clang/lib/Sema/SemaExceptionSpec.cpp
+++ b/clang/lib/Sema/SemaExceptionSpec.cpp
@@ -1386,7 +1386,6 @@
case Expr::StringLiteralClass:
case Expr::SourceLocExprClass:
case Expr::ConceptSpecializationExprClass:
- case Expr::RequiresExprClass:
// These expressions can never throw.
return CT_Cannot;
diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp
index ea4b93e..5f40719 100644
--- a/clang/lib/Sema/SemaExpr.cpp
+++ b/clang/lib/Sema/SemaExpr.cpp
@@ -350,17 +350,6 @@
}
}
- if (isa<ParmVarDecl>(D) && isa<RequiresExprBodyDecl>(D->getDeclContext()) &&
- !isUnevaluatedContext()) {
- // C++ [expr.prim.req.nested] p3
- // A local parameter shall only appear as an unevaluated operand
- // (Clause 8) within the constraint-expression.
- Diag(Loc, diag::err_requires_expr_parameter_referenced_in_evaluated_context)
- << D;
- Diag(D->getLocation(), diag::note_entity_declared_at) << D;
- return true;
- }
-
return false;
}
@@ -1915,7 +1904,7 @@
bool RefersToCapturedVariable =
isa<VarDecl>(D) &&
NeedToCaptureVariable(cast<VarDecl>(D), NameInfo.getLoc());
-
+
DeclRefExpr *E = DeclRefExpr::Create(
Context, NNS, TemplateKWLoc, D, RefersToCapturedVariable, NameInfo, Ty,
VK, FoundD, TemplateArgs, getNonOdrUseReasonInCurrentContext(D));
diff --git a/clang/lib/Sema/SemaExprCXX.cpp b/clang/lib/Sema/SemaExprCXX.cpp
index 192c237..938420d 100644
--- a/clang/lib/Sema/SemaExprCXX.cpp
+++ b/clang/lib/Sema/SemaExprCXX.cpp
@@ -11,7 +11,6 @@
///
//===----------------------------------------------------------------------===//
-#include "clang/Sema/Template.h"
#include "clang/Sema/SemaInternal.h"
#include "TreeTransform.h"
#include "TypeLocBuilder.h"
@@ -8332,215 +8331,3 @@
return CheckMicrosoftIfExistsSymbol(S, SS, TargetNameInfo);
}
-
-concepts::Requirement *Sema::ActOnSimpleRequirement(Expr *E) {
- return BuildExprRequirement(E, /*IsSimple=*/true,
- /*NoexceptLoc=*/SourceLocation(),
- /*ReturnTypeRequirement=*/{});
-}
-
-concepts::Requirement *
-Sema::ActOnTypeRequirement(SourceLocation TypenameKWLoc, CXXScopeSpec &SS,
- SourceLocation NameLoc, IdentifierInfo *TypeName,
- TemplateIdAnnotation *TemplateId) {
- assert(((!TypeName && TemplateId) || (TypeName && !TemplateId)) &&
- "Exactly one of TypeName and TemplateId must be specified.");
- TypeSourceInfo *TSI = nullptr;
- if (TypeName) {
- QualType T = CheckTypenameType(ETK_Typename, TypenameKWLoc,
- SS.getWithLocInContext(Context), *TypeName,
- NameLoc, &TSI, /*DeducedTypeContext=*/false);
- if (T.isNull())
- return nullptr;
- } else {
- ASTTemplateArgsPtr ArgsPtr(TemplateId->getTemplateArgs(),
- TemplateId->NumArgs);
- TypeResult T = ActOnTypenameType(CurScope, TypenameKWLoc, SS,
- TemplateId->TemplateKWLoc,
- TemplateId->Template, TemplateId->Name,
- TemplateId->TemplateNameLoc,
- TemplateId->LAngleLoc, ArgsPtr,
- TemplateId->RAngleLoc);
- if (T.isInvalid())
- return nullptr;
- if (GetTypeFromParser(T.get(), &TSI).isNull())
- return nullptr;
- }
- return BuildTypeRequirement(TSI);
-}
-
-concepts::Requirement *
-Sema::ActOnCompoundRequirement(Expr *E, SourceLocation NoexceptLoc) {
- return BuildExprRequirement(E, /*IsSimple=*/false, NoexceptLoc,
- /*ReturnTypeRequirement=*/{});
-}
-
-concepts::Requirement *
-Sema::ActOnCompoundRequirement(
- Expr *E, SourceLocation NoexceptLoc, CXXScopeSpec &SS,
- TemplateIdAnnotation *TypeConstraint, unsigned Depth) {
- // C++2a [expr.prim.req.compound] p1.3.3
- // [..] the expression is deduced against an invented function template
- // F [...] F is a void function template with a single type template
- // parameter T declared with the constrained-parameter. Form a new
- // cv-qualifier-seq cv by taking the union of const and volatile specifiers
- // around the constrained-parameter. F has a single parameter whose
- // type-specifier is cv T followed by the abstract-declarator. [...]
- //
- // The cv part is done in the calling function - we get the concept with
- // arguments and the abstract declarator with the correct CV qualification and
- // have to synthesize T and the single parameter of F.
- auto &II = Context.Idents.get("expr-type");
- auto *TParam = TemplateTypeParmDecl::Create(Context, CurContext,
- SourceLocation(),
- SourceLocation(), Depth,
- /*Index=*/0, &II,
- /*Typename=*/true,
- /*ParameterPack=*/false,
- /*HasTypeConstraint=*/true);
-
- if (ActOnTypeConstraint(SS, TypeConstraint, TParam,
- /*EllpsisLoc=*/SourceLocation()))
- // Just produce a requirement with no type requirements.
- return BuildExprRequirement(E, /*IsSimple=*/false, NoexceptLoc, {});
-
- auto *TPL = TemplateParameterList::Create(Context, SourceLocation(),
- SourceLocation(),
- ArrayRef<NamedDecl *>(TParam),
- SourceLocation(),
- /*RequiresClause=*/nullptr);
- return BuildExprRequirement(
- E, /*IsSimple=*/false, NoexceptLoc,
- concepts::ExprRequirement::ReturnTypeRequirement(TPL));
-}
-
-concepts::ExprRequirement *
-Sema::BuildExprRequirement(
- Expr *E, bool IsSimple, SourceLocation NoexceptLoc,
- concepts::ExprRequirement::ReturnTypeRequirement ReturnTypeRequirement) {
- auto Status = concepts::ExprRequirement::SS_Satisfied;
- ConceptSpecializationExpr *SubstitutedConstraintExpr = nullptr;
- if (E->isInstantiationDependent() || ReturnTypeRequirement.isDependent())
- Status = concepts::ExprRequirement::SS_Dependent;
- else if (NoexceptLoc.isValid() && canThrow(E) == CanThrowResult::CT_Can)
- Status = concepts::ExprRequirement::SS_NoexceptNotMet;
- else if (ReturnTypeRequirement.isSubstitutionFailure())
- Status = concepts::ExprRequirement::SS_TypeRequirementSubstitutionFailure;
- else if (ReturnTypeRequirement.isTypeConstraint()) {
- // C++2a [expr.prim.req]p1.3.3
- // The immediately-declared constraint ([temp]) of decltype((E)) shall
- // be satisfied.
- TemplateParameterList *TPL =
- ReturnTypeRequirement.getTypeConstraintTemplateParameterList();
- QualType MatchedType =
- BuildDecltypeType(E, E->getBeginLoc()).getCanonicalType();
- llvm::SmallVector<TemplateArgument, 1> Args;
- Args.push_back(TemplateArgument(MatchedType));
- TemplateArgumentList TAL(TemplateArgumentList::OnStack, Args);
- MultiLevelTemplateArgumentList MLTAL(TAL);
- for (unsigned I = 0; I < TPL->getDepth(); ++I)
- MLTAL.addOuterRetainedLevel();
- Expr *IDC =
- cast<TemplateTypeParmDecl>(TPL->getParam(0))->getTypeConstraint()
- ->getImmediatelyDeclaredConstraint();
- ExprResult Constraint = SubstExpr(IDC, MLTAL);
- assert(!Constraint.isInvalid() &&
- "Substitution cannot fail as it is simply putting a type template "
- "argument into a concept specialization expression's parameter.");
-
- SubstitutedConstraintExpr =
- cast<ConceptSpecializationExpr>(Constraint.get());
- if (!SubstitutedConstraintExpr->isSatisfied())
- Status = concepts::ExprRequirement::SS_ConstraintsNotSatisfied;
- }
- return new (Context) concepts::ExprRequirement(E, IsSimple, NoexceptLoc,
- ReturnTypeRequirement, Status,
- SubstitutedConstraintExpr);
-}
-
-concepts::ExprRequirement *
-Sema::BuildExprRequirement(
- concepts::Requirement::SubstitutionDiagnostic *ExprSubstitutionDiagnostic,
- bool IsSimple, SourceLocation NoexceptLoc,
- concepts::ExprRequirement::ReturnTypeRequirement ReturnTypeRequirement) {
- return new (Context) concepts::ExprRequirement(ExprSubstitutionDiagnostic,
- IsSimple, NoexceptLoc,
- ReturnTypeRequirement);
-}
-
-concepts::TypeRequirement *
-Sema::BuildTypeRequirement(TypeSourceInfo *Type) {
- return new (Context) concepts::TypeRequirement(Type);
-}
-
-concepts::TypeRequirement *
-Sema::BuildTypeRequirement(
- concepts::Requirement::SubstitutionDiagnostic *SubstDiag) {
- return new (Context) concepts::TypeRequirement(SubstDiag);
-}
-
-concepts::Requirement *Sema::ActOnNestedRequirement(Expr *Constraint) {
- return BuildNestedRequirement(Constraint);
-}
-
-concepts::NestedRequirement *
-Sema::BuildNestedRequirement(Expr *Constraint) {
- ConstraintSatisfaction Satisfaction;
- if (!Constraint->isInstantiationDependent() &&
- CheckConstraintSatisfaction(Constraint, Satisfaction))
- return nullptr;
- return new (Context) concepts::NestedRequirement(Context, Constraint,
- Satisfaction);
-}
-
-concepts::NestedRequirement *
-Sema::BuildNestedRequirement(
- concepts::Requirement::SubstitutionDiagnostic *SubstDiag) {
- return new (Context) concepts::NestedRequirement(SubstDiag);
-}
-
-RequiresExprBodyDecl *
-Sema::ActOnStartRequiresExpr(SourceLocation RequiresKWLoc,
- ArrayRef<ParmVarDecl *> LocalParameters,
- Scope *BodyScope) {
- assert(BodyScope);
-
- RequiresExprBodyDecl *Body = RequiresExprBodyDecl::Create(Context, CurContext,
- RequiresKWLoc);
-
- PushDeclContext(BodyScope, Body);
-
- for (ParmVarDecl *Param : LocalParameters) {
- if (Param->hasDefaultArg())
- // C++2a [expr.prim.req] p4
- // [...] A local parameter of a requires-expression shall not have a
- // default argument. [...]
- Diag(Param->getDefaultArgRange().getBegin(),
- diag::err_requires_expr_local_parameter_default_argument);
- // Ignore default argument and move on
-
- Param->setDeclContext(Body);
- // If this has an identifier, add it to the scope stack.
- if (Param->getIdentifier()) {
- CheckShadow(BodyScope, Param);
- PushOnScopeChains(Param, BodyScope);
- }
- }
- return Body;
-}
-
-void Sema::ActOnFinishRequiresExpr() {
- assert(CurContext && "DeclContext imbalance!");
- CurContext = CurContext->getLexicalParent();
- assert(CurContext && "Popped translation unit!");
-}
-
-ExprResult
-Sema::ActOnRequiresExpr(SourceLocation RequiresKWLoc,
- RequiresExprBodyDecl *Body,
- ArrayRef<ParmVarDecl *> LocalParameters,
- ArrayRef<concepts::Requirement *> Requirements,
- SourceLocation ClosingBraceLoc) {
- return RequiresExpr::Create(Context, RequiresKWLoc, Body, LocalParameters,
- Requirements, ClosingBraceLoc);
-}
diff --git a/clang/lib/Sema/SemaLookup.cpp b/clang/lib/Sema/SemaLookup.cpp
index 8d96404..0ed51de 100644
--- a/clang/lib/Sema/SemaLookup.cpp
+++ b/clang/lib/Sema/SemaLookup.cpp
@@ -1575,9 +1575,7 @@
unsigned N = CodeSynthesisContexts.size();
for (unsigned I = CodeSynthesisContextLookupModules.size();
I != N; ++I) {
- Module *M = CodeSynthesisContexts[I].Entity ?
- getDefiningModule(*this, CodeSynthesisContexts[I].Entity) :
- nullptr;
+ Module *M = getDefiningModule(*this, CodeSynthesisContexts[I].Entity);
if (M && !LookupModulesCache.insert(M).second)
M = nullptr;
CodeSynthesisContextLookupModules.push_back(M);
diff --git a/clang/lib/Sema/SemaTemplate.cpp b/clang/lib/Sema/SemaTemplate.cpp
index 661a662..8a50a9e 100755
--- a/clang/lib/Sema/SemaTemplate.cpp
+++ b/clang/lib/Sema/SemaTemplate.cpp
@@ -10010,12 +10010,24 @@
<< FixItHint::CreateRemoval(TypenameLoc);
NestedNameSpecifierLoc QualifierLoc = SS.getWithLocInContext(Context);
- TypeSourceInfo *TSI = nullptr;
QualType T = CheckTypenameType(TypenameLoc.isValid()? ETK_Typename : ETK_None,
- TypenameLoc, QualifierLoc, II, IdLoc, &TSI,
- /*DeducedTSTContext=*/true);
+ TypenameLoc, QualifierLoc, II, IdLoc);
if (T.isNull())
return true;
+
+ TypeSourceInfo *TSI = Context.CreateTypeSourceInfo(T);
+ if (isa<DependentNameType>(T)) {
+ DependentNameTypeLoc TL = TSI->getTypeLoc().castAs<DependentNameTypeLoc>();
+ TL.setElaboratedKeywordLoc(TypenameLoc);
+ TL.setQualifierLoc(QualifierLoc);
+ TL.setNameLoc(IdLoc);
+ } else {
+ ElaboratedTypeLoc TL = TSI->getTypeLoc().castAs<ElaboratedTypeLoc>();
+ TL.setElaboratedKeywordLoc(TypenameLoc);
+ TL.setQualifierLoc(QualifierLoc);
+ TL.getNamedTypeLoc().castAs<TypeSpecTypeLoc>().setNameLoc(IdLoc);
+ }
+
return CreateParsedType(T, TSI);
}
@@ -10152,35 +10164,6 @@
return true;
}
-QualType
-Sema::CheckTypenameType(ElaboratedTypeKeyword Keyword,
- SourceLocation KeywordLoc,
- NestedNameSpecifierLoc QualifierLoc,
- const IdentifierInfo &II,
- SourceLocation IILoc,
- TypeSourceInfo **TSI,
- bool DeducedTSTContext) {
- QualType T = CheckTypenameType(Keyword, KeywordLoc, QualifierLoc, II, IILoc,
- DeducedTSTContext);
- if (T.isNull())
- return QualType();
-
- *TSI = Context.CreateTypeSourceInfo(T);
- if (isa<DependentNameType>(T)) {
- DependentNameTypeLoc TL =
- (*TSI)->getTypeLoc().castAs<DependentNameTypeLoc>();
- TL.setElaboratedKeywordLoc(KeywordLoc);
- TL.setQualifierLoc(QualifierLoc);
- TL.setNameLoc(IILoc);
- } else {
- ElaboratedTypeLoc TL = (*TSI)->getTypeLoc().castAs<ElaboratedTypeLoc>();
- TL.setElaboratedKeywordLoc(KeywordLoc);
- TL.setQualifierLoc(QualifierLoc);
- TL.getNamedTypeLoc().castAs<TypeSpecTypeLoc>().setNameLoc(IILoc);
- }
- return T;
-}
-
/// Build the type that describes a C++ typename specifier,
/// e.g., "typename T::type".
QualType
@@ -10188,38 +10171,32 @@
SourceLocation KeywordLoc,
NestedNameSpecifierLoc QualifierLoc,
const IdentifierInfo &II,
- SourceLocation IILoc, bool DeducedTSTContext) {
+ SourceLocation IILoc) {
CXXScopeSpec SS;
SS.Adopt(QualifierLoc);
- DeclContext *Ctx = nullptr;
- if (QualifierLoc) {
- Ctx = computeDeclContext(SS);
- if (!Ctx) {
- // If the nested-name-specifier is dependent and couldn't be
- // resolved to a type, build a typename type.
- assert(QualifierLoc.getNestedNameSpecifier()->isDependent());
- return Context.getDependentNameType(Keyword,
- QualifierLoc.getNestedNameSpecifier(),
- &II);
- }
-
- // If the nested-name-specifier refers to the current instantiation,
- // the "typename" keyword itself is superfluous. In C++03, the
- // program is actually ill-formed. However, DR 382 (in C++0x CD1)
- // allows such extraneous "typename" keywords, and we retroactively
- // apply this DR to C++03 code with only a warning. In any case we continue.
-
- if (RequireCompleteDeclContext(SS, Ctx))
- return QualType();
+ DeclContext *Ctx = computeDeclContext(SS);
+ if (!Ctx) {
+ // If the nested-name-specifier is dependent and couldn't be
+ // resolved to a type, build a typename type.
+ assert(QualifierLoc.getNestedNameSpecifier()->isDependent());
+ return Context.getDependentNameType(Keyword,
+ QualifierLoc.getNestedNameSpecifier(),
+ &II);
}
+ // If the nested-name-specifier refers to the current instantiation,
+ // the "typename" keyword itself is superfluous. In C++03, the
+ // program is actually ill-formed. However, DR 382 (in C++0x CD1)
+ // allows such extraneous "typename" keywords, and we retroactively
+ // apply this DR to C++03 code with only a warning. In any case we continue.
+
+ if (RequireCompleteDeclContext(SS, Ctx))
+ return QualType();
+
DeclarationName Name(&II);
LookupResult Result(*this, Name, IILoc, LookupOrdinaryName);
- if (Ctx)
- LookupQualifiedName(Result, Ctx, SS);
- else
- LookupName(Result, CurScope);
+ LookupQualifiedName(Result, Ctx, SS);
unsigned DiagID = 0;
Decl *Referenced = nullptr;
switch (Result.getResultKind()) {
@@ -10228,7 +10205,7 @@
// a more specific diagnostic.
SourceRange CondRange;
Expr *Cond = nullptr;
- if (Ctx && isEnableIf(QualifierLoc, II, CondRange, Cond)) {
+ if (isEnableIf(QualifierLoc, II, CondRange, Cond)) {
// If we have a condition, narrow it down to the specific failed
// condition.
if (Cond) {
@@ -10244,14 +10221,12 @@
return QualType();
}
- Diag(CondRange.getBegin(),
- diag::err_typename_nested_not_found_enable_if)
+ Diag(CondRange.getBegin(), diag::err_typename_nested_not_found_enable_if)
<< Ctx << CondRange;
return QualType();
}
- DiagID = Ctx ? diag::err_typename_nested_not_found
- : diag::err_unknown_typename;
+ DiagID = diag::err_typename_nested_not_found;
break;
}
@@ -10317,19 +10292,6 @@
// is a placeholder for a deduced class type [...].
if (getLangOpts().CPlusPlus17) {
if (auto *TD = getAsTypeTemplateDecl(Result.getFoundDecl())) {
- if (!DeducedTSTContext) {
- QualType T(QualifierLoc
- ? QualifierLoc.getNestedNameSpecifier()->getAsType()
- : nullptr, 0);
- if (!T.isNull())
- Diag(IILoc, diag::err_dependent_deduced_tst)
- << (int)getTemplateNameKindForDiagnostics(TemplateName(TD)) << T;
- else
- Diag(IILoc, diag::err_deduced_tst)
- << (int)getTemplateNameKindForDiagnostics(TemplateName(TD));
- Diag(TD->getLocation(), diag::note_template_decl_here);
- return QualType();
- }
return Context.getElaboratedType(
Keyword, QualifierLoc.getNestedNameSpecifier(),
Context.getDeducedTemplateSpecializationType(TemplateName(TD),
@@ -10337,14 +10299,12 @@
}
}
- DiagID = Ctx ? diag::err_typename_nested_not_type
- : diag::err_typename_not_type;
+ DiagID = diag::err_typename_nested_not_type;
Referenced = Result.getFoundDecl();
break;
case LookupResult::FoundOverloaded:
- DiagID = Ctx ? diag::err_typename_nested_not_type
- : diag::err_typename_not_type;
+ DiagID = diag::err_typename_nested_not_type;
Referenced = *Result.begin();
break;
@@ -10356,14 +10316,9 @@
// type. Emit an appropriate diagnostic and return an error.
SourceRange FullRange(KeywordLoc.isValid() ? KeywordLoc : SS.getBeginLoc(),
IILoc);
- if (Ctx)
- Diag(IILoc, DiagID) << FullRange << Name << Ctx;
- else
- Diag(IILoc, DiagID) << FullRange << Name;
+ Diag(IILoc, DiagID) << FullRange << Name << Ctx;
if (Referenced)
- Diag(Referenced->getLocation(),
- Ctx ? diag::note_typename_member_refers_here
- : diag::note_typename_refers_here)
+ Diag(Referenced->getLocation(), diag::note_typename_refers_here)
<< Name;
return QualType();
}
diff --git a/clang/lib/Sema/SemaTemplateInstantiate.cpp b/clang/lib/Sema/SemaTemplateInstantiate.cpp
index 39bc28d..af41e23 100644
--- a/clang/lib/Sema/SemaTemplateInstantiate.cpp
+++ b/clang/lib/Sema/SemaTemplateInstantiate.cpp
@@ -26,7 +26,6 @@
#include "clang/Sema/Template.h"
#include "clang/Sema/TemplateDeduction.h"
#include "clang/Sema/TemplateInstCallback.h"
-#include "clang/Sema/SemaConcept.h"
#include "llvm/Support/TimeProfiler.h"
using namespace clang;
@@ -200,10 +199,8 @@
case DeducedTemplateArgumentSubstitution:
case PriorTemplateArgumentSubstitution:
case ConstraintsCheck:
- case NestedRequirementConstraintsCheck:
return true;
- case RequirementInstantiation:
case DefaultTemplateArgumentChecking:
case DeclaringSpecialMember:
case DeclaringImplicitEqualityComparison:
@@ -250,7 +247,7 @@
Inst.InstantiationRange = InstantiationRange;
SemaRef.pushCodeSynthesisContext(Inst);
- AlreadyInstantiating = !Inst.Entity ? false :
+ AlreadyInstantiating =
!SemaRef.InstantiatingSpecializations
.insert(std::make_pair(Inst.Entity->getCanonicalDecl(), Inst.Kind))
.second;
@@ -369,26 +366,6 @@
Sema::InstantiatingTemplate::InstantiatingTemplate(
Sema &SemaRef, SourceLocation PointOfInstantiation,
- concepts::Requirement *Req, sema::TemplateDeductionInfo &DeductionInfo,
- SourceRange InstantiationRange)
- : InstantiatingTemplate(
- SemaRef, CodeSynthesisContext::RequirementInstantiation,
- PointOfInstantiation, InstantiationRange, /*Entity=*/nullptr,
- /*Template=*/nullptr, /*TemplateArgs=*/None, &DeductionInfo) {}
-
-
-Sema::InstantiatingTemplate::InstantiatingTemplate(
- Sema &SemaRef, SourceLocation PointOfInstantiation,
- concepts::NestedRequirement *Req, ConstraintsCheck,
- SourceRange InstantiationRange)
- : InstantiatingTemplate(
- SemaRef, CodeSynthesisContext::NestedRequirementConstraintsCheck,
- PointOfInstantiation, InstantiationRange, /*Entity=*/nullptr,
- /*Template=*/nullptr, /*TemplateArgs=*/None) {}
-
-
-Sema::InstantiatingTemplate::InstantiatingTemplate(
- Sema &SemaRef, SourceLocation PointOfInstantiation,
ConstraintsCheck, NamedDecl *Template,
ArrayRef<TemplateArgument> TemplateArgs, SourceRange InstantiationRange)
: InstantiatingTemplate(
@@ -469,9 +446,8 @@
if (!Invalid) {
if (!AlreadyInstantiating) {
auto &Active = SemaRef.CodeSynthesisContexts.back();
- if (Active.Entity)
- SemaRef.InstantiatingSpecializations.erase(
- std::make_pair(Active.Entity, Active.Kind));
+ SemaRef.InstantiatingSpecializations.erase(
+ std::make_pair(Active.Entity, Active.Kind));
}
atTemplateEnd(SemaRef.TemplateInstCallbacks, SemaRef,
@@ -708,18 +684,6 @@
<< Active->InstantiationRange;
break;
- case CodeSynthesisContext::RequirementInstantiation:
- Diags.Report(Active->PointOfInstantiation,
- diag::note_template_requirement_instantiation_here)
- << Active->InstantiationRange;
- break;
-
- case CodeSynthesisContext::NestedRequirementConstraintsCheck:
- Diags.Report(Active->PointOfInstantiation,
- diag::note_nested_requirement_here)
- << Active->InstantiationRange;
- break;
-
case CodeSynthesisContext::DeclaringSpecialMember:
Diags.Report(Active->PointOfInstantiation,
diag::note_in_declaration_of_implicit_special_member)
@@ -824,7 +788,6 @@
case CodeSynthesisContext::ConstraintsCheck:
case CodeSynthesisContext::ParameterMappingSubstitution:
case CodeSynthesisContext::ConstraintNormalization:
- case CodeSynthesisContext::NestedRequirementConstraintsCheck:
// This is a template instantiation, so there is no SFINAE.
return None;
@@ -839,10 +802,9 @@
case CodeSynthesisContext::ExplicitTemplateArgumentSubstitution:
case CodeSynthesisContext::DeducedTemplateArgumentSubstitution:
case CodeSynthesisContext::ConstraintSubstitution:
- case CodeSynthesisContext::RequirementInstantiation:
- // We're either substituting explicitly-specified template arguments,
- // deduced template arguments, a constraint expression or a requirement
- // in a requires expression, so SFINAE applies.
+ // We're either substituting explicitly-specified template arguments
+ // or deduced template arguments or a constraint expression, so SFINAE
+ // applies.
assert(Active->DeductionInfo && "Missing deduction info pointer");
return Active->DeductionInfo;
@@ -1094,41 +1056,6 @@
return TreeTransform<TemplateInstantiator>::TransformLambdaExpr(E);
}
- ExprResult TransformRequiresExpr(RequiresExpr *E) {
- LocalInstantiationScope Scope(SemaRef, /*CombineWithOuterScope=*/true);
- return TreeTransform<TemplateInstantiator>::TransformRequiresExpr(E);
- }
-
- bool TransformRequiresExprRequirements(
- ArrayRef<concepts::Requirement *> Reqs,
- SmallVectorImpl<concepts::Requirement *> &Transformed) {
- bool SatisfactionDetermined = false;
- for (concepts::Requirement *Req : Reqs) {
- concepts::Requirement *TransReq = nullptr;
- if (!SatisfactionDetermined) {
- if (auto *TypeReq = dyn_cast<concepts::TypeRequirement>(Req))
- TransReq = TransformTypeRequirement(TypeReq);
- else if (auto *ExprReq = dyn_cast<concepts::ExprRequirement>(Req))
- TransReq = TransformExprRequirement(ExprReq);
- else
- TransReq = TransformNestedRequirement(
- cast<concepts::NestedRequirement>(Req));
- if (!TransReq)
- return true;
- if (!TransReq->isDependent() && !TransReq->isSatisfied())
- // [expr.prim.req]p6
- // [...] The substitution and semantic constraint checking
- // proceeds in lexical order and stops when a condition that
- // determines the result of the requires-expression is
- // encountered. [..]
- SatisfactionDetermined = true;
- } else
- TransReq = Req;
- Transformed.push_back(TransReq);
- }
- return false;
- }
-
TemplateParameterList *TransformTemplateParameterList(
TemplateParameterList *OrigTPL) {
if (!OrigTPL || !OrigTPL->size()) return OrigTPL;
@@ -1138,14 +1065,6 @@
/* DeclContext *Owner */ Owner, TemplateArgs);
return DeclInstantiator.SubstTemplateParams(OrigTPL);
}
-
- concepts::TypeRequirement *
- TransformTypeRequirement(concepts::TypeRequirement *Req);
- concepts::ExprRequirement *
- TransformExprRequirement(concepts::ExprRequirement *Req);
- concepts::NestedRequirement *
- TransformNestedRequirement(concepts::NestedRequirement *Req);
-
private:
ExprResult transformNonTypeTemplateParmRef(NonTypeTemplateParmDecl *parm,
SourceLocation loc,
@@ -1750,163 +1669,6 @@
return Result;
}
-template<typename EntityPrinter>
-static concepts::Requirement::SubstitutionDiagnostic *
-createSubstDiag(Sema &S, TemplateDeductionInfo &Info, EntityPrinter Printer) {
- SmallString<128> Message;
- SourceLocation ErrorLoc;
- if (Info.hasSFINAEDiagnostic()) {
- PartialDiagnosticAt PDA(SourceLocation(),
- PartialDiagnostic::NullDiagnostic{});
- Info.takeSFINAEDiagnostic(PDA);
- PDA.second.EmitToString(S.getDiagnostics(), Message);
- ErrorLoc = PDA.first;
- } else {
- ErrorLoc = Info.getLocation();
- }
- char *MessageBuf = new (S.Context) char[Message.size()];
- std::copy(Message.begin(), Message.end(), MessageBuf);
- SmallString<128> Entity;
- llvm::raw_svector_ostream OS(Entity);
- Printer(OS);
- char *EntityBuf = new (S.Context) char[Entity.size()];
- std::copy(Entity.begin(), Entity.end(), EntityBuf);
- return new (S.Context) concepts::Requirement::SubstitutionDiagnostic{
- StringRef(EntityBuf, Entity.size()), ErrorLoc,
- StringRef(MessageBuf, Message.size())};
-}
-
-concepts::TypeRequirement *
-TemplateInstantiator::TransformTypeRequirement(concepts::TypeRequirement *Req) {
- if (!Req->isDependent() && !AlwaysRebuild())
- return Req;
- if (Req->isSubstitutionFailure()) {
- if (AlwaysRebuild())
- return RebuildTypeRequirement(
- Req->getSubstitutionDiagnostic());
- return Req;
- }
-
- Sema::SFINAETrap Trap(SemaRef);
- TemplateDeductionInfo Info(Req->getType()->getTypeLoc().getBeginLoc());
- Sema::InstantiatingTemplate TypeInst(SemaRef,
- Req->getType()->getTypeLoc().getBeginLoc(), Req, Info,
- Req->getType()->getTypeLoc().getSourceRange());
- if (TypeInst.isInvalid())
- return nullptr;
- TypeSourceInfo *TransType = TransformType(Req->getType());
- if (!TransType || Trap.hasErrorOccurred())
- return RebuildTypeRequirement(createSubstDiag(SemaRef, Info,
- [&] (llvm::raw_ostream& OS) {
- Req->getType()->getType().print(OS, SemaRef.getPrintingPolicy());
- }));
- return RebuildTypeRequirement(TransType);
-}
-
-concepts::ExprRequirement *
-TemplateInstantiator::TransformExprRequirement(concepts::ExprRequirement *Req) {
- if (!Req->isDependent() && !AlwaysRebuild())
- return Req;
-
- Sema::SFINAETrap Trap(SemaRef);
- TemplateDeductionInfo Info(Req->getExpr()->getBeginLoc());
-
- llvm::PointerUnion<Expr *, concepts::Requirement::SubstitutionDiagnostic *>
- TransExpr;
- if (Req->isExprSubstitutionFailure())
- TransExpr = Req->getExprSubstitutionDiagnostic();
- else {
- Sema::InstantiatingTemplate ExprInst(SemaRef, Req->getExpr()->getBeginLoc(),
- Req, Info,
- Req->getExpr()->getSourceRange());
- if (ExprInst.isInvalid())
- return nullptr;
- ExprResult TransExprRes = TransformExpr(Req->getExpr());
- if (TransExprRes.isInvalid() || Trap.hasErrorOccurred())
- TransExpr = createSubstDiag(SemaRef, Info,
- [&] (llvm::raw_ostream& OS) {
- Req->getExpr()->printPretty(OS, nullptr,
- SemaRef.getPrintingPolicy());
- });
- else
- TransExpr = TransExprRes.get();
- }
-
- llvm::Optional<concepts::ExprRequirement::ReturnTypeRequirement> TransRetReq;
- const auto &RetReq = Req->getReturnTypeRequirement();
- if (RetReq.isEmpty())
- TransRetReq.emplace();
- else if (RetReq.isSubstitutionFailure())
- TransRetReq.emplace(RetReq.getSubstitutionDiagnostic());
- else if (RetReq.isTypeConstraint()) {
- TemplateParameterList *OrigTPL =
- RetReq.getTypeConstraintTemplateParameterList();
- Sema::InstantiatingTemplate TPLInst(SemaRef, OrigTPL->getTemplateLoc(),
- Req, Info, OrigTPL->getSourceRange());
- if (TPLInst.isInvalid())
- return nullptr;
- TemplateParameterList *TPL =
- TransformTemplateParameterList(OrigTPL);
- if (!TPL)
- TransRetReq.emplace(createSubstDiag(SemaRef, Info,
- [&] (llvm::raw_ostream& OS) {
- RetReq.getTypeConstraint()->getImmediatelyDeclaredConstraint()
- ->printPretty(OS, nullptr, SemaRef.getPrintingPolicy());
- }));
- else {
- TPLInst.Clear();
- TransRetReq.emplace(TPL);
- }
- }
- assert(TransRetReq.hasValue() &&
- "All code paths leading here must set TransRetReq");
- if (Expr *E = TransExpr.dyn_cast<Expr *>())
- return RebuildExprRequirement(E, Req->isSimple(), Req->getNoexceptLoc(),
- std::move(*TransRetReq));
- return RebuildExprRequirement(
- TransExpr.get<concepts::Requirement::SubstitutionDiagnostic *>(),
- Req->isSimple(), Req->getNoexceptLoc(), std::move(*TransRetReq));
-}
-
-concepts::NestedRequirement *
-TemplateInstantiator::TransformNestedRequirement(
- concepts::NestedRequirement *Req) {
- if (!Req->isDependent() && !AlwaysRebuild())
- return Req;
- if (Req->isSubstitutionFailure()) {
- if (AlwaysRebuild())
- return RebuildNestedRequirement(
- Req->getSubstitutionDiagnostic());
- return Req;
- }
- Sema::InstantiatingTemplate ReqInst(SemaRef,
- Req->getConstraintExpr()->getBeginLoc(), Req,
- Sema::InstantiatingTemplate::ConstraintsCheck{},
- Req->getConstraintExpr()->getSourceRange());
-
- ExprResult TransConstraint;
- TemplateDeductionInfo Info(Req->getConstraintExpr()->getBeginLoc());
- {
- EnterExpressionEvaluationContext ContextRAII(
- SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
- Sema::SFINAETrap Trap(SemaRef);
- Sema::InstantiatingTemplate ConstrInst(SemaRef,
- Req->getConstraintExpr()->getBeginLoc(), Req, Info,
- Req->getConstraintExpr()->getSourceRange());
- if (ConstrInst.isInvalid())
- return nullptr;
- TransConstraint = TransformExpr(Req->getConstraintExpr());
- if (TransConstraint.isInvalid() || Trap.hasErrorOccurred())
- return RebuildNestedRequirement(createSubstDiag(SemaRef, Info,
- [&] (llvm::raw_ostream& OS) {
- Req->getConstraintExpr()->printPretty(OS, nullptr,
- SemaRef.getPrintingPolicy());
- }));
- }
- return RebuildNestedRequirement(TransConstraint.get());
-}
-
-
/// Perform substitution on the type T with a given set of template
/// arguments.
///
diff --git a/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp b/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp
index a470cfc..64500d0 100755
--- a/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp
+++ b/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp
@@ -3600,12 +3600,6 @@
llvm_unreachable("Concept definitions cannot reside inside a template");
}
-Decl *
-TemplateDeclInstantiator::VisitRequiresExprBodyDecl(RequiresExprBodyDecl *D) {
- return RequiresExprBodyDecl::Create(SemaRef.Context, D->getDeclContext(),
- D->getBeginLoc());
-}
-
Decl *TemplateDeclInstantiator::VisitDecl(Decl *D) {
llvm_unreachable("Unexpected decl");
}
diff --git a/clang/lib/Sema/SemaType.cpp b/clang/lib/Sema/SemaType.cpp
index efb4437..a860640 100644
--- a/clang/lib/Sema/SemaType.cpp
+++ b/clang/lib/Sema/SemaType.cpp
@@ -2994,9 +2994,6 @@
case DeclaratorContext::PrototypeContext:
Error = 0;
break;
- case DeclaratorContext::RequiresExprContext:
- Error = 21;
- break;
case DeclaratorContext::LambdaExprParameterContext:
// In C++14, generic lambdas allow 'auto' in their parameters.
if (!SemaRef.getLangOpts().CPlusPlus14 ||
@@ -3224,7 +3221,6 @@
case DeclaratorContext::ObjCParameterContext:
case DeclaratorContext::ObjCResultContext:
case DeclaratorContext::KNRTypeListContext:
- case DeclaratorContext::RequiresExprContext:
// C++ [dcl.fct]p6:
// Types shall not be defined in return or parameter types.
DiagID = diag::err_type_defined_in_param_type;
@@ -4283,7 +4279,6 @@
case DeclaratorContext::TemplateTypeArgContext:
case DeclaratorContext::TypeNameContext:
case DeclaratorContext::FunctionalCastContext:
- case DeclaratorContext::RequiresExprContext:
// Don't infer in these contexts.
break;
}
@@ -5232,7 +5227,6 @@
switch (D.getContext()) {
case DeclaratorContext::PrototypeContext:
case DeclaratorContext::LambdaExprParameterContext:
- case DeclaratorContext::RequiresExprContext:
// C++0x [dcl.fct]p13:
// [...] When it is part of a parameter-declaration-clause, the
// parameter pack is a function parameter pack (14.5.3). The type T
diff --git a/clang/lib/Sema/TreeTransform.h b/clang/lib/Sema/TreeTransform.h
index 1f72511..3b827fb 100644
--- a/clang/lib/Sema/TreeTransform.h
+++ b/clang/lib/Sema/TreeTransform.h
@@ -19,7 +19,6 @@
#include "clang/AST/DeclObjC.h"
#include "clang/AST/DeclTemplate.h"
#include "clang/AST/Expr.h"
-#include "clang/AST/ExprConcepts.h"
#include "clang/AST/ExprCXX.h"
#include "clang/AST/ExprObjC.h"
#include "clang/AST/ExprOpenMP.h"
@@ -510,15 +509,6 @@
DeclarationNameInfo
TransformDeclarationNameInfo(const DeclarationNameInfo &NameInfo);
- bool TransformRequiresExprRequirements(ArrayRef<concepts::Requirement *> Reqs,
- llvm::SmallVectorImpl<concepts::Requirement *> &Transformed);
- concepts::TypeRequirement *
- TransformTypeRequirement(concepts::TypeRequirement *Req);
- concepts::ExprRequirement *
- TransformExprRequirement(concepts::ExprRequirement *Req);
- concepts::NestedRequirement *
- TransformNestedRequirement(concepts::NestedRequirement *Req);
-
/// Transform the given template name.
///
/// \param SS The nested-name-specifier that qualifies the template
@@ -1066,8 +1056,23 @@
}
if (Keyword == ETK_None || Keyword == ETK_Typename) {
- return SemaRef.CheckTypenameType(Keyword, KeywordLoc, QualifierLoc,
- *Id, IdLoc, DeducedTSTContext);
+ QualType T = SemaRef.CheckTypenameType(Keyword, KeywordLoc, QualifierLoc,
+ *Id, IdLoc);
+ // If a dependent name resolves to a deduced template specialization type,
+ // check that we're in one of the syntactic contexts permitting it.
+ if (!DeducedTSTContext) {
+ if (auto *Deduced = dyn_cast_or_null<DeducedTemplateSpecializationType>(
+ T.isNull() ? nullptr : T->getContainedDeducedType())) {
+ SemaRef.Diag(IdLoc, diag::err_dependent_deduced_tst)
+ << (int)SemaRef.getTemplateNameKindForDiagnostics(
+ Deduced->getTemplateName())
+ << QualType(QualifierLoc.getNestedNameSpecifier()->getAsType(), 0);
+ if (auto *TD = Deduced->getTemplateName().getAsTemplateDecl())
+ SemaRef.Diag(TD->getLocation(), diag::note_template_decl_here);
+ return QualType();
+ }
+ }
+ return T;
}
TagTypeKind Kind = TypeWithKeyword::getTagTypeKindForKeyword(Keyword);
@@ -3073,56 +3078,7 @@
return Result;
}
- /// \brief Build a new requires expression.
- ///
- /// By default, performs semantic analysis to build the new expression.
- /// Subclasses may override this routine to provide different behavior.
- ExprResult RebuildRequiresExpr(SourceLocation RequiresKWLoc,
- RequiresExprBodyDecl *Body,
- ArrayRef<ParmVarDecl *> LocalParameters,
- ArrayRef<concepts::Requirement *> Requirements,
- SourceLocation ClosingBraceLoc) {
- return RequiresExpr::Create(SemaRef.Context, RequiresKWLoc, Body,
- LocalParameters, Requirements, ClosingBraceLoc);
- }
-
- concepts::TypeRequirement *
- RebuildTypeRequirement(
- concepts::Requirement::SubstitutionDiagnostic *SubstDiag) {
- return SemaRef.BuildTypeRequirement(SubstDiag);
- }
-
- concepts::TypeRequirement *RebuildTypeRequirement(TypeSourceInfo *T) {
- return SemaRef.BuildTypeRequirement(T);
- }
-
- concepts::ExprRequirement *
- RebuildExprRequirement(
- concepts::Requirement::SubstitutionDiagnostic *SubstDiag, bool IsSimple,
- SourceLocation NoexceptLoc,
- concepts::ExprRequirement::ReturnTypeRequirement Ret) {
- return SemaRef.BuildExprRequirement(SubstDiag, IsSimple, NoexceptLoc,
- std::move(Ret));
- }
-
- concepts::ExprRequirement *
- RebuildExprRequirement(Expr *E, bool IsSimple, SourceLocation NoexceptLoc,
- concepts::ExprRequirement::ReturnTypeRequirement Ret) {
- return SemaRef.BuildExprRequirement(E, IsSimple, NoexceptLoc,
- std::move(Ret));
- }
-
- concepts::NestedRequirement *
- RebuildNestedRequirement(
- concepts::Requirement::SubstitutionDiagnostic *SubstDiag) {
- return SemaRef.BuildNestedRequirement(SubstDiag);
- }
-
- concepts::NestedRequirement *RebuildNestedRequirement(Expr *Constraint) {
- return SemaRef.BuildNestedRequirement(Constraint);
- }
-
- /// \brief Build a new Objective-C boxed expression.
+ /// \brief Build a new Objective-C boxed expression.
///
/// By default, performs semantic analysis to build the new expression.
/// Subclasses may override this routine to provide different behavior.
@@ -11223,146 +11179,6 @@
&TransArgs);
}
-template<typename Derived>
-ExprResult
-TreeTransform<Derived>::TransformRequiresExpr(RequiresExpr *E) {
- SmallVector<ParmVarDecl*, 4> TransParams;
- SmallVector<QualType, 4> TransParamTypes;
- Sema::ExtParameterInfoBuilder ExtParamInfos;
-
- // C++2a [expr.prim.req]p2
- // Expressions appearing within a requirement-body are unevaluated operands.
- EnterExpressionEvaluationContext Ctx(
- SemaRef, Sema::ExpressionEvaluationContext::Unevaluated);
-
- RequiresExprBodyDecl *Body = RequiresExprBodyDecl::Create(
- getSema().Context, E->getBody()->getDeclContext(),
- E->getBody()->getBeginLoc());
-
- Sema::ContextRAII SavedContext(getSema(), Body, /*NewThisContext*/false);
-
- if (getDerived().TransformFunctionTypeParams(E->getRequiresKWLoc(),
- E->getLocalParameters(),
- /*ParamTypes=*/nullptr,
- /*ParamInfos=*/nullptr,
- TransParamTypes, &TransParams,
- ExtParamInfos))
- return ExprError();
-
- for (ParmVarDecl *Param : TransParams)
- Param->setDeclContext(Body);
-
- SmallVector<concepts::Requirement *, 4> TransReqs;
- if (getDerived().TransformRequiresExprRequirements(E->getRequirements(),
- TransReqs))
- return ExprError();
-
- for (concepts::Requirement *Req : TransReqs) {
- if (auto *ER = dyn_cast<concepts::ExprRequirement>(Req)) {
- if (ER->getReturnTypeRequirement().isTypeConstraint()) {
- ER->getReturnTypeRequirement()
- .getTypeConstraintTemplateParameterList()->getParam(0)
- ->setDeclContext(Body);
- }
- }
- }
-
- return getDerived().RebuildRequiresExpr(E->getRequiresKWLoc(), Body,
- TransParams, TransReqs,
- E->getRBraceLoc());
-}
-
-template<typename Derived>
-bool TreeTransform<Derived>::TransformRequiresExprRequirements(
- ArrayRef<concepts::Requirement *> Reqs,
- SmallVectorImpl<concepts::Requirement *> &Transformed) {
- for (concepts::Requirement *Req : Reqs) {
- concepts::Requirement *TransReq = nullptr;
- if (auto *TypeReq = dyn_cast<concepts::TypeRequirement>(Req))
- TransReq = getDerived().TransformTypeRequirement(TypeReq);
- else if (auto *ExprReq = dyn_cast<concepts::ExprRequirement>(Req))
- TransReq = getDerived().TransformExprRequirement(ExprReq);
- else
- TransReq = getDerived().TransformNestedRequirement(
- cast<concepts::NestedRequirement>(Req));
- if (!TransReq)
- return true;
- Transformed.push_back(TransReq);
- }
- return false;
-}
-
-template<typename Derived>
-concepts::TypeRequirement *
-TreeTransform<Derived>::TransformTypeRequirement(
- concepts::TypeRequirement *Req) {
- if (Req->isSubstitutionFailure()) {
- if (getDerived().AlwaysRebuild())
- return getDerived().RebuildTypeRequirement(
- Req->getSubstitutionDiagnostic());
- return Req;
- }
- TypeSourceInfo *TransType = getDerived().TransformType(Req->getType());
- if (!TransType)
- return nullptr;
- return getDerived().RebuildTypeRequirement(TransType);
-}
-
-template<typename Derived>
-concepts::ExprRequirement *
-TreeTransform<Derived>::TransformExprRequirement(concepts::ExprRequirement *Req) {
- llvm::PointerUnion<Expr *, concepts::Requirement::SubstitutionDiagnostic *> TransExpr;
- if (Req->isExprSubstitutionFailure())
- TransExpr = Req->getExprSubstitutionDiagnostic();
- else {
- ExprResult TransExprRes = getDerived().TransformExpr(Req->getExpr());
- if (TransExprRes.isInvalid())
- return nullptr;
- TransExpr = TransExprRes.get();
- }
-
- llvm::Optional<concepts::ExprRequirement::ReturnTypeRequirement> TransRetReq;
- const auto &RetReq = Req->getReturnTypeRequirement();
- if (RetReq.isEmpty())
- TransRetReq.emplace();
- else if (RetReq.isSubstitutionFailure())
- TransRetReq.emplace(RetReq.getSubstitutionDiagnostic());
- else if (RetReq.isTypeConstraint()) {
- TemplateParameterList *OrigTPL =
- RetReq.getTypeConstraintTemplateParameterList();
- TemplateParameterList *TPL =
- getDerived().TransformTemplateParameterList(OrigTPL);
- if (!TPL)
- return nullptr;
- TransRetReq.emplace(TPL);
- }
- assert(TransRetReq.hasValue() &&
- "All code paths leading here must set TransRetReq");
- if (Expr *E = TransExpr.dyn_cast<Expr *>())
- return getDerived().RebuildExprRequirement(E, Req->isSimple(),
- Req->getNoexceptLoc(),
- std::move(*TransRetReq));
- return getDerived().RebuildExprRequirement(
- TransExpr.get<concepts::Requirement::SubstitutionDiagnostic *>(),
- Req->isSimple(), Req->getNoexceptLoc(), std::move(*TransRetReq));
-}
-
-template<typename Derived>
-concepts::NestedRequirement *
-TreeTransform<Derived>::TransformNestedRequirement(
- concepts::NestedRequirement *Req) {
- if (Req->isSubstitutionFailure()) {
- if (getDerived().AlwaysRebuild())
- return getDerived().RebuildNestedRequirement(
- Req->getSubstitutionDiagnostic());
- return Req;
- }
- ExprResult TransConstraint =
- getDerived().TransformExpr(Req->getConstraintExpr());
- if (TransConstraint.isInvalid())
- return nullptr;
- return getDerived().RebuildNestedRequirement(TransConstraint.get());
-}
template<typename Derived>
ExprResult