aboutsummaryrefslogtreecommitdiff
path: root/include/clang/AST/TemplateName.h
diff options
context:
space:
mode:
authorDouglas Gregor <dgregor@apple.com>2011-07-01 01:22:09 +0000
committerDouglas Gregor <dgregor@apple.com>2011-07-01 01:22:09 +0000
commit561f81243f665cf2001caadc45df505f826b72d6 (patch)
treeb294898bc5e1eb5b81b1699d4d4f00ba764a9ac8 /include/clang/AST/TemplateName.h
parent68a51a7f9c01ccbe7232d41beeb4deb26f40b013 (diff)
Introduce the notion of instantiation dependence into Clang's AST. A
type/expression/template argument/etc. is instantiation-dependent if it somehow involves a template parameter, even if it doesn't meet the requirements for the more common kinds of dependence (dependent type, type-dependent expression, value-dependent expression). When we see an instantiation-dependent type, we know we always need to perform substitution into that instantiation-dependent type. This keeps us from short-circuiting evaluation in places where we shouldn't, and lets us properly implement C++0x [temp.type]p2. In theory, this would also allow us to properly mangle instantiation-dependent-but-not-dependent decltype types per the Itanium C++ ABI, but we aren't quite there because we still mangle based on the canonical type in cases like, e.g., template<unsigned> struct A { }; template<typename T> void f(A<sizeof(sizeof(decltype(T() + T())))>) { } template void f<int>(A<sizeof(sizeof(int))>); and therefore get the wrong answer. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@134225 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'include/clang/AST/TemplateName.h')
-rw-r--r--include/clang/AST/TemplateName.h4
1 files changed, 4 insertions, 0 deletions
diff --git a/include/clang/AST/TemplateName.h b/include/clang/AST/TemplateName.h
index db4612990f..a180f587ed 100644
--- a/include/clang/AST/TemplateName.h
+++ b/include/clang/AST/TemplateName.h
@@ -292,6 +292,10 @@ public:
/// \brief Determines whether this is a dependent template name.
bool isDependent() const;
+ /// \brief Determines whether this is a template name that somehow
+ /// depends on a template parameter.
+ bool isInstantiationDependent() const;
+
/// \brief Determines whether this template name contains an
/// unexpanded parameter pack (for C++0x variadic templates).
bool containsUnexpandedParameterPack() const;