[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