[cfe-commits] r83893 - /cfe/trunk/test/CXX/temp/temp.spec/temp.expl.spec/p6.cpp
Douglas Gregor
dgregor at apple.com
Mon Oct 12 13:23:10 PDT 2009
Author: dgregor
Date: Mon Oct 12 15:23:10 2009
New Revision: 83893
URL: http://llvm.org/viewvc/llvm-project?rev=83893&view=rev
Log:
Add test for last commit
Added:
cfe/trunk/test/CXX/temp/temp.spec/temp.expl.spec/p6.cpp
Added: cfe/trunk/test/CXX/temp/temp.spec/temp.expl.spec/p6.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CXX/temp/temp.spec/temp.expl.spec/p6.cpp?rev=83893&view=auto
==============================================================================
--- cfe/trunk/test/CXX/temp/temp.spec/temp.expl.spec/p6.cpp (added)
+++ cfe/trunk/test/CXX/temp/temp.spec/temp.expl.spec/p6.cpp Mon Oct 12 15:23:10 2009
@@ -0,0 +1,56 @@
+// RUN: clang-cc -fsyntax-only -verify %s
+
+template<typename T>
+struct X0 {
+ void f();
+
+ template<typename U>
+ void g(U);
+
+ struct Nested {
+ };
+
+ static T member;
+};
+
+int &use_X0_int(X0<int> x0i, // expected-note{{implicit instantiation first required here}}
+ int i) {
+ x0i.f(); // expected-note{{implicit instantiation first required here}}
+ x0i.g(i); // expected-note{{implicit instantiation first required here}}
+ X0<int>::Nested nested; // expected-note{{implicit instantiation first required here}}
+ return X0<int>::member; // expected-note{{implicit instantiation first required here}}
+}
+
+template<>
+void X0<int>::f() { // expected-error{{after instantiation}}
+}
+
+template<> template<>
+void X0<int>::g(int) { // expected-error{{after instantiation}}
+}
+
+template<>
+struct X0<int>::Nested { }; // expected-error{{after instantiation}}
+
+template<>
+int X0<int>::member = 17; // expected-error{{after instantiation}}
+
+template<>
+struct X0<int> { }; // expected-error{{after instantiation}}
+
+// Example from the standard
+template<class T> class Array { /* ... */ };
+
+template<class T> void sort(Array<T>& v) { /* ... */ }
+
+struct String {};
+
+void f(Array<String>& v) {
+
+ sort(v); // expected-note{{required}}
+ // use primary template
+ // sort(Array<T>&), T is String
+}
+
+template<> void sort<String>(Array<String>& v); // // expected-error{{after instantiation}}
+template<> void sort<>(Array<char*>& v); // OK: sort<char*> not yet used
More information about the cfe-commits
mailing list