Skip to content

Commit af0dbaa

Browse files
committed
Revert "Following up on PR48517, fix handling of template arguments that refer"
This reverts commit 8c1f2d1. This is part of 5 commits being reverted due to https://crbug.com/1161059. See bug for repro.
1 parent 2080232 commit af0dbaa

32 files changed

+158
-221
lines changed

clang/include/clang/AST/Expr.h

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -578,12 +578,12 @@ class Expr : public ValueStmt {
578578
struct EvalStatus {
579579
/// Whether the evaluated expression has side effects.
580580
/// For example, (f() && 0) can be folded, but it still has side effects.
581-
bool HasSideEffects = false;
581+
bool HasSideEffects;
582582

583583
/// Whether the evaluation hit undefined behavior.
584584
/// For example, 1.0 / 0.0 can be folded to Inf, but has undefined behavior.
585585
/// Likewise, INT_MAX + 1 can be folded to INT_MIN, but has UB.
586-
bool HasUndefinedBehavior = false;
586+
bool HasUndefinedBehavior;
587587

588588
/// Diag - If this is non-null, it will be filled in with a stack of notes
589589
/// indicating why evaluation failed (or why it failed to produce a constant
@@ -592,7 +592,10 @@ class Expr : public ValueStmt {
592592
/// foldable. If the expression is foldable, but not a constant expression,
593593
/// the notes will describes why it isn't a constant expression. If the
594594
/// expression *is* a constant expression, no notes will be produced.
595-
SmallVectorImpl<PartialDiagnosticAt> *Diag = nullptr;
595+
SmallVectorImpl<PartialDiagnosticAt> *Diag;
596+
597+
EvalStatus()
598+
: HasSideEffects(false), HasUndefinedBehavior(false), Diag(nullptr) {}
596599

597600
// hasSideEffects - Return true if the evaluated expression has
598601
// side effects.
@@ -603,11 +606,8 @@ class Expr : public ValueStmt {
603606

604607
/// EvalResult is a struct with detailed info about an evaluated expression.
605608
struct EvalResult : EvalStatus {
606-
/// This is the value the expression can be folded to.
609+
/// Val - This is the value the expression can be folded to.
607610
APValue Val;
608-
/// Indicates whether Val contains a pointer or reference or pointer to
609-
/// member naming a templated entity, and thus the value is dependent.
610-
bool Dependent = false;
611611

612612
// isGlobalLValue - Return true if the evaluated lvalue expression
613613
// is global.

clang/include/clang/AST/TemplateBase.h

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -252,12 +252,6 @@ class TemplateArgument {
252252
/// Whether this template argument is dependent on a template
253253
/// parameter such that its result can change from one instantiation to
254254
/// another.
255-
///
256-
/// It's not always meaningful to ask whether a template argument is
257-
/// dependent before it's been converted to match a template parameter;
258-
/// whether a non-type template argument is dependent depends on the
259-
/// corresponding parameter. For an unconverted template argument, this
260-
/// returns true if the argument *might* be dependent.
261255
bool isDependent() const;
262256

263257
/// Whether this template argument is dependent on a template
@@ -680,6 +674,13 @@ struct alignas(void *) ASTTemplateKWAndArgsInfo {
680674
void initializeFrom(SourceLocation TemplateKWLoc,
681675
const TemplateArgumentListInfo &List,
682676
TemplateArgumentLoc *OutArgArray);
677+
// FIXME: The parameter Deps is the result populated by this method, the
678+
// caller doesn't need it since it is populated by computeDependence. remove
679+
// it.
680+
void initializeFrom(SourceLocation TemplateKWLoc,
681+
const TemplateArgumentListInfo &List,
682+
TemplateArgumentLoc *OutArgArray,
683+
TemplateArgumentDependence &Deps);
683684
void initializeFrom(SourceLocation TemplateKWLoc);
684685

685686
void copyInto(const TemplateArgumentLoc *ArgArray,

clang/include/clang/Sema/Sema.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3353,8 +3353,7 @@ class Sema final {
33533353
llvm::APSInt &Value, CCEKind CCE);
33543354
ExprResult CheckConvertedConstantExpression(Expr *From, QualType T,
33553355
APValue &Value, CCEKind CCE,
3356-
NamedDecl *Dest = nullptr,
3357-
bool *ValueDependent = nullptr);
3356+
NamedDecl *Dest = nullptr);
33583357

33593358
/// Abstract base class used to perform a contextual implicit
33603359
/// conversion from an expression to any type passing a filter.

clang/lib/AST/ComputeDependence.cpp

Lines changed: 2 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ ExprDependence clang::computeDependence(UnaryOperator *E,
6464
if (VD && VD->isTemplated()) {
6565
auto *VarD = dyn_cast<VarDecl>(VD);
6666
if (!VarD || !VarD->hasLocalStorage())
67-
Dep |= ExprDependence::ValueInstantiation;
67+
Dep |= ExprDependence::Value;
6868
}
6969
}
7070
}
@@ -443,21 +443,12 @@ ExprDependence clang::computeDependence(DeclRefExpr *E, const ASTContext &Ctx) {
443443
if (auto *FirstArg = E->getTemplateArgs()) {
444444
unsigned NumArgs = E->getNumTemplateArgs();
445445
for (auto *Arg = FirstArg, *End = FirstArg + NumArgs; Arg < End; ++Arg)
446-
Deps |= toExprDependence(Arg->getArgument().getDependence() &
447-
~TemplateArgumentDependence::Dependent);
446+
Deps |= toExprDependence(Arg->getArgument().getDependence());
448447
}
449448

450449
auto *Decl = E->getDecl();
451-
auto *Found = E->getFoundDecl();
452450
auto Type = E->getType();
453451

454-
// FIXME: For a ParmVarDecl referenced in a function signature, we don't know
455-
// its dependence yet!
456-
if (!isa<ParmVarDecl>(Decl)) {
457-
if (Decl->getDeclContext()->isDependentContext() ||
458-
(Found && Found->getDeclContext()->isDependentContext()))
459-
Deps |= ExprDependence::Instantiation;
460-
}
461452
if (Decl->isParameterPack())
462453
Deps |= ExprDependence::UnexpandedPack;
463454
Deps |= toExprDependence(Type->getDependence()) & ExprDependence::Error;

clang/lib/AST/Expr.cpp

Lines changed: 18 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -416,9 +416,12 @@ DeclRefExpr::DeclRefExpr(const ASTContext &Ctx,
416416
RefersToEnclosingVariableOrCapture;
417417
DeclRefExprBits.NonOdrUseReason = NOUR;
418418
if (TemplateArgs) {
419+
auto Deps = TemplateArgumentDependence::None;
419420
getTrailingObjects<ASTTemplateKWAndArgsInfo>()->initializeFrom(
420-
TemplateKWLoc, *TemplateArgs,
421-
getTrailingObjects<TemplateArgumentLoc>());
421+
TemplateKWLoc, *TemplateArgs, getTrailingObjects<TemplateArgumentLoc>(),
422+
Deps);
423+
assert(!(Deps & TemplateArgumentDependence::Dependent) &&
424+
"built a DeclRefExpr with dependent template args");
422425
} else if (TemplateKWLoc.isValid()) {
423426
getTrailingObjects<ASTTemplateKWAndArgsInfo>()->initializeFrom(
424427
TemplateKWLoc);
@@ -1521,8 +1524,16 @@ MemberExpr *MemberExpr::Create(
15211524
MemberExpr *E = new (Mem) MemberExpr(Base, IsArrow, OperatorLoc, MemberDecl,
15221525
NameInfo, T, VK, OK, NOUR);
15231526

1524-
// FIXME: Move this into the constructor.
1527+
// FIXME: remove remaining dependence computation to computeDependence().
1528+
auto Deps = E->getDependence();
15251529
if (HasQualOrFound) {
1530+
// FIXME: Wrong. We should be looking at the member declaration we found.
1531+
if (QualifierLoc && QualifierLoc.getNestedNameSpecifier()->isDependent())
1532+
Deps |= ExprDependence::TypeValueInstantiation;
1533+
else if (QualifierLoc &&
1534+
QualifierLoc.getNestedNameSpecifier()->isInstantiationDependent())
1535+
Deps |= ExprDependence::Instantiation;
1536+
15261537
E->MemberExprBits.HasQualifierOrFoundDecl = true;
15271538

15281539
MemberExprNameQualifier *NQ =
@@ -1535,26 +1546,16 @@ MemberExpr *MemberExpr::Create(
15351546
TemplateArgs || TemplateKWLoc.isValid();
15361547

15371548
if (TemplateArgs) {
1549+
auto TemplateArgDeps = TemplateArgumentDependence::None;
15381550
E->getTrailingObjects<ASTTemplateKWAndArgsInfo>()->initializeFrom(
15391551
TemplateKWLoc, *TemplateArgs,
1540-
E->getTrailingObjects<TemplateArgumentLoc>());
1552+
E->getTrailingObjects<TemplateArgumentLoc>(), TemplateArgDeps);
1553+
if (TemplateArgDeps & TemplateArgumentDependence::Instantiation)
1554+
Deps |= ExprDependence::Instantiation;
15411555
} else if (TemplateKWLoc.isValid()) {
15421556
E->getTrailingObjects<ASTTemplateKWAndArgsInfo>()->initializeFrom(
15431557
TemplateKWLoc);
15441558
}
1545-
1546-
// FIXME: remove remaining dependence computation to computeDependence().
1547-
auto Deps = E->getDependence();
1548-
if (NestedNameSpecifier *Qual = E->getQualifier()) {
1549-
// FIXME: Wrong. We should be looking at the member declaration we found.
1550-
if (Qual->isDependent())
1551-
Deps |= ExprDependence::TypeValueInstantiation;
1552-
else if (Qual->isInstantiationDependent())
1553-
Deps |= ExprDependence::Instantiation;
1554-
}
1555-
if (TemplateSpecializationType::anyInstantiationDependentTemplateArguments(
1556-
E->template_arguments()))
1557-
Deps |= ExprDependence::Instantiation;
15581559
E->setDependence(Deps);
15591560

15601561
return E;

clang/lib/AST/ExprCXX.cpp

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -433,8 +433,9 @@ OverloadExpr::OverloadExpr(StmtClass SC, const ASTContext &Context,
433433
}
434434

435435
if (TemplateArgs) {
436+
auto Deps = TemplateArgumentDependence::None;
436437
getTrailingASTTemplateKWAndArgsInfo()->initializeFrom(
437-
TemplateKWLoc, *TemplateArgs, getTrailingTemplateArgumentLoc());
438+
TemplateKWLoc, *TemplateArgs, getTrailingTemplateArgumentLoc(), Deps);
438439
} else if (TemplateKWLoc.isValid()) {
439440
getTrailingASTTemplateKWAndArgsInfo()->initializeFrom(TemplateKWLoc);
440441
}
@@ -463,8 +464,9 @@ DependentScopeDeclRefExpr::DependentScopeDeclRefExpr(
463464
DependentScopeDeclRefExprBits.HasTemplateKWAndArgsInfo =
464465
(Args != nullptr) || TemplateKWLoc.isValid();
465466
if (Args) {
467+
auto Deps = TemplateArgumentDependence::None;
466468
getTrailingObjects<ASTTemplateKWAndArgsInfo>()->initializeFrom(
467-
TemplateKWLoc, *Args, getTrailingObjects<TemplateArgumentLoc>());
469+
TemplateKWLoc, *Args, getTrailingObjects<TemplateArgumentLoc>(), Deps);
468470
} else if (TemplateKWLoc.isValid()) {
469471
getTrailingObjects<ASTTemplateKWAndArgsInfo>()->initializeFrom(
470472
TemplateKWLoc);
@@ -1374,9 +1376,10 @@ CXXDependentScopeMemberExpr::CXXDependentScopeMemberExpr(
13741376
CXXDependentScopeMemberExprBits.OperatorLoc = OperatorLoc;
13751377

13761378
if (TemplateArgs) {
1379+
auto Deps = TemplateArgumentDependence::None;
13771380
getTrailingObjects<ASTTemplateKWAndArgsInfo>()->initializeFrom(
1378-
TemplateKWLoc, *TemplateArgs,
1379-
getTrailingObjects<TemplateArgumentLoc>());
1381+
TemplateKWLoc, *TemplateArgs, getTrailingObjects<TemplateArgumentLoc>(),
1382+
Deps);
13801383
} else if (TemplateKWLoc.isValid()) {
13811384
getTrailingObjects<ASTTemplateKWAndArgsInfo>()->initializeFrom(
13821385
TemplateKWLoc);

0 commit comments

Comments
 (0)