summaryrefslogtreecommitdiffstats
path: root/clang/test/SemaTemplate/instantiate-declref.cpp
diff options
context:
space:
mode:
authorDouglas Gregor <dgregor@apple.com>2009-05-27 17:07:49 +0000
committerDouglas Gregor <dgregor@apple.com>2009-05-27 17:07:49 +0000
commitf98d9b60dbee3f523541b6f8831d1e549e4b0630 (patch)
treedf981cc93c08eeb53a951a26fed1d64fd80dc7a6 /clang/test/SemaTemplate/instantiate-declref.cpp
parentbbcf90f9361ae3a7529f023697a01dcde31ad973 (diff)
downloadbcm5719-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.cpp27
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;
OpenPOWER on IntegriCloud