forked from OSchip/llvm-project
PR17800: When performing pack expansion, we must always rebuild the AST nodes
to avoid breaking AST invariants by reusing Stmt nodes within the same function. llvm-svn: 194217
This commit is contained in:
parent
a98da3d236
commit
2aa81a718e
|
@ -142,7 +142,11 @@ public:
|
|||
///
|
||||
/// Subclasses may override this function to specify when the transformation
|
||||
/// should rebuild all AST nodes.
|
||||
bool AlwaysRebuild() { return false; }
|
||||
///
|
||||
/// We must always rebuild all AST nodes when performing variadic template
|
||||
/// pack expansion, in order to avoid violating the AST invariant that each
|
||||
/// statement node appears at most once in its containing declaration.
|
||||
bool AlwaysRebuild() { return SemaRef.ArgumentPackSubstitutionIndex != -1; }
|
||||
|
||||
/// \brief Returns the location of the entity being transformed, if that
|
||||
/// information was not available elsewhere in the AST.
|
||||
|
|
|
@ -1811,3 +1811,16 @@ namespace NeverConstantTwoWays {
|
|||
1 / 0 : // expected-warning {{division by zero}} expected-note {{division by zero}}
|
||||
0;
|
||||
}
|
||||
|
||||
namespace PR17800 {
|
||||
struct A {
|
||||
constexpr int operator()() const { return 0; }
|
||||
};
|
||||
template <typename ...T> constexpr int sink(T ...) {
|
||||
return 0;
|
||||
}
|
||||
template <int ...N> constexpr int run() {
|
||||
return sink(A()() + N ...);
|
||||
}
|
||||
constexpr int k = run<1, 2, 3>();
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue