diff options
author | Douglas Gregor <dgregor@apple.com> | 2009-05-27 17:07:49 +0000 |
---|---|---|
committer | Douglas Gregor <dgregor@apple.com> | 2009-05-27 17:07:49 +0000 |
commit | f98d9b60dbee3f523541b6f8831d1e549e4b0630 (patch) | |
tree | df981cc93c08eeb53a951a26fed1d64fd80dc7a6 /clang/test/SemaTemplate/instantiate-declref.cpp | |
parent | bbcf90f9361ae3a7529f023697a01dcde31ad973 (diff) | |
download | bcm5719-llvm-f98d9b60dbee3f523541b6f8831d1e549e4b0630.tar.gz bcm5719-llvm-f98d9b60dbee3f523541b6f8831d1e549e4b0630.zip |
Improve name lookup for and template instantiation of declaration
references. There are several smallish fixes here:
- Make sure we look through template parameter scope when
determining whether we're parsing a nested class (or nested class
*template*). This makes sure that we delay parsing the bodies of
inline member functions until after we're out of the outermost
class (template) scope.
- Since the bodies of member functions are always parsed
"out-of-line", even when they were declared in-line, teach
unqualified name lookup to look into the (semantic) parents.
- Use the new InstantiateDeclRef to handle the instantiation of a
reference to a declaration (in DeclRefExpr), which drastically
simplifies template instantiation for DeclRefExprs.
- When we're instantiating a ParmVarDecl, it must be in the current
instantiation scope, so only look there.
Also, remove the #if 0's and FIXME's from the dynarray example, which
now compiles and executes thanks to Anders and Eli.
llvm-svn: 72481
Diffstat (limited to 'clang/test/SemaTemplate/instantiate-declref.cpp')
-rw-r--r-- | clang/test/SemaTemplate/instantiate-declref.cpp | 27 |
1 files changed, 27 insertions, 0 deletions
diff --git a/clang/test/SemaTemplate/instantiate-declref.cpp b/clang/test/SemaTemplate/instantiate-declref.cpp new file mode 100644 index 00000000000..2512df15b13 --- /dev/null +++ b/clang/test/SemaTemplate/instantiate-declref.cpp @@ -0,0 +1,27 @@ +// RUN: clang-cc -fsyntax-only %s + +namespace N { + struct Outer { + struct Inner { + template<typename T> + struct InnerTemplate { + struct VeryInner { + typedef T type; + + static enum K1 { K1Val = sizeof(T) } Kind1; + // FIXME: Remove the name K2, below + static enum K2 { K2Val = sizeof(T)*2 } Kind2; + + void foo() { + K1 k1 = K1Val; + Kind1 = K1Val; + Outer::Inner::InnerTemplate<type>::VeryInner::Kind2 = K2Val; + } + }; + }; + }; + }; +} + +typedef int INT; +template struct N::Outer::Inner::InnerTemplate<INT>::VeryInner; |