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.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@72481 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/test/SemaTemplate/example-dynarray.cpp b/test/SemaTemplate/example-dynarray.cpp
index 1fe85d9..0fcaba3 100644
--- a/test/SemaTemplate/example-dynarray.cpp
+++ b/test/SemaTemplate/example-dynarray.cpp
@@ -120,8 +120,6 @@
assert(di.size() == 4);
di.push_back(4);
-#if 0
- // FIXME: Copy construction via copy initialization
dynarray<int> di2 = di;
assert(di2.size() == 5);
assert(di.begin() != di2.begin());
@@ -129,7 +127,6 @@
I != IEnd; ++I)
assert(*I == I - di2.begin());
- // FIXME: Copy construction via direct initialization
dynarray<int> di3(di);
assert(di3.size() == 5);
assert(di.begin() != di3.begin());
@@ -137,7 +134,6 @@
I != IEnd; ++I)
assert(*I == I - di3.begin());
- // FIXME: assignment operator
dynarray<int> di4;
assert(di4.size() == 0);
di4 = di;
@@ -146,7 +142,6 @@
for (dynarray<int>::iterator I = di4.begin(), IEnd = di4.end();
I != IEnd; ++I)
assert(*I == I - di4.begin());
-#endif
return 0;
}
diff --git a/test/SemaTemplate/instantiate-declref.cpp b/test/SemaTemplate/instantiate-declref.cpp
new file mode 100644
index 0000000..2512df1
--- /dev/null
+++ b/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;