Enable expression transformations in the current-instantiation

rebuilder, i.e., remove a silly short-sighted hack from long
ago. Thanks to Abramo Bagnara for the test case/bug report!

llvm-svn: 109583
This commit is contained in:
Douglas Gregor 2010-07-28 15:14:14 +00:00
parent df65c8ed2a
commit bbfd2c0a86
2 changed files with 35 additions and 9 deletions

View File

@ -5427,15 +5427,6 @@ namespace {
this->Loc = Loc;
this->Entity = Entity;
}
/// \brief Transforms an expression by returning the expression itself
/// (an identity function).
///
/// FIXME: This is completely unsafe; we will need to actually clone the
/// expressions.
Sema::OwningExprResult TransformExpr(Expr *E) {
return getSema().Owned(E->Retain());
}
};
}

View File

@ -164,3 +164,38 @@ namespace ConstantInCurrentInstantiation {
template<typename T>
int X<T>::array[X<T>::value] = { 1, 2 };
}
namespace Expressions {
template <bool b>
struct Bool {
enum anonymous_enum { value = b };
};
struct True : public Bool<true> {};
struct False : public Bool<false> {};
template <typename T1, typename T2>
struct Is_Same : public False {};
template <typename T>
struct Is_Same<T, T> : public True {};
template <bool b, typename T = void>
struct Enable_If {};
template <typename T>
struct Enable_If<true, T> {
typedef T type;
};
template <typename T>
class Class {
public:
template <typename U>
typename Enable_If<Is_Same<U, Class>::value, void>::type
foo();
};
template <typename T>
template <typename U>
typename Enable_If<Is_Same<U, Class<T> >::value, void>::type
Class<T>::foo() {}
}