diff options
author | Douglas Gregor <dgregor@apple.com> | 2009-06-25 22:08:12 +0000 |
---|---|---|
committer | Douglas Gregor <dgregor@apple.com> | 2009-06-25 22:08:12 +0000 |
commit | e53060fa78ad7e98352049f72787bdb7543e2a48 (patch) | |
tree | d0c7858e55ac3c7d6f8fb15257c37385e952393e /test/SemaTemplate/temp_arg_template.cpp | |
parent | 6e4a86ddadea69e855603c1733d8b5bc99fc910d (diff) | |
download | clang-e53060fa78ad7e98352049f72787bdb7543e2a48.tar.gz clang-e53060fa78ad7e98352049f72787bdb7543e2a48.tar.bz2 clang-e53060fa78ad7e98352049f72787bdb7543e2a48.tar.xz |
Improved semantic analysis and AST respresentation for function
templates.
For example, this now type-checks (but does not instantiate the body
of deref<int>):
template<typename T> T& deref(T* t) { return *t; }
void test(int *ip) {
int &ir = deref(ip);
}
Specific changes/additions:
* Template argument deduction from a call to a function template.
* Instantiation of a function template specializations (just the
declarations) from the template arguments deduced from a call.
* FunctionTemplateDecls are stored directly in declaration contexts
and found via name lookup (all forms), rather than finding the
FunctionDecl and then realizing it is a template. This is
responsible for most of the churn, since some of the core
declaration matching and lookup code assumes that all functions are
FunctionDecls.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@74213 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'test/SemaTemplate/temp_arg_template.cpp')
-rw-r--r-- | test/SemaTemplate/temp_arg_template.cpp | 4 |
1 files changed, 2 insertions, 2 deletions
diff --git a/test/SemaTemplate/temp_arg_template.cpp b/test/SemaTemplate/temp_arg_template.cpp index a5e9f75fa7..f2ee66b3f7 100644 --- a/test/SemaTemplate/temp_arg_template.cpp +++ b/test/SemaTemplate/temp_arg_template.cpp @@ -26,12 +26,12 @@ B<X> *a6; // expected-error{{template template argument has different template p C<Y> *a7; C<Ylong> *a8; // expected-error{{template template argument has different template parameters than its corresponding template template parameter}} -template<typename T> void f(int); +template<typename T> void f(int); // expected-note{{function template}} // FIXME: we're right to provide an error message, but it should say // that we need a class template. We won't get this right until name // lookup of 'f' returns a TemplateDecl. -A<f> *a9; // expected-error{{template argument for template template parameter must be a template}} +A<f> *a9; // expected-error{{template argument does not refer to}} // FIXME: The code below is ill-formed, because of the evil digraph '<:'. // We should provide a much better error message than we currently do. |