r194946 - Tests for core issues 224-240.

Richard Smith richard-llvm at metafoo.co.uk
Sat Nov 16 18:50:30 PST 2013


Author: rsmith
Date: Sat Nov 16 20:50:30 2013
New Revision: 194946

URL: http://llvm.org/viewvc/llvm-project?rev=194946&view=rev
Log:
Tests for core issues 224-240.

Modified:
    cfe/trunk/test/CXX/drs/dr2xx.cpp
    cfe/trunk/www/cxx_dr_status.html

Modified: cfe/trunk/test/CXX/drs/dr2xx.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CXX/drs/dr2xx.cpp?rev=194946&r1=194945&r2=194946&view=diff
==============================================================================
--- cfe/trunk/test/CXX/drs/dr2xx.cpp (original)
+++ cfe/trunk/test/CXX/drs/dr2xx.cpp Sat Nov 16 20:50:30 2013
@@ -217,3 +217,191 @@ namespace dr221 { // dr221: yes
 // apparently both voted into the WP and acted upon by the editor.
 
 // dr223: na
+
+namespace dr224 { // dr224: no
+  namespace example1 {
+    template <class T> class A {
+      typedef int type;
+      A::type a;
+      A<T>::type b;
+      A<T*>::type c; // expected-error {{missing 'typename'}}
+      ::dr224::example1::A<T>::type d;
+
+      class B {
+        typedef int type;
+
+        A::type a;
+        A<T>::type b;
+        A<T*>::type c; // expected-error {{missing 'typename'}}
+        ::dr224::example1::A<T>::type d;
+
+        B::type e;
+        A<T>::B::type f;
+        A<T*>::B::type g; // expected-error {{missing 'typename'}}
+        typename A<T*>::B::type h;
+      };
+    };
+
+    template <class T> class A<T*> {
+      typedef int type;
+      A<T*>::type a;
+      A<T>::type b; // expected-error {{missing 'typename'}}
+    };
+
+    template <class T1, class T2, int I> struct B {
+      typedef int type;
+      B<T1, T2, I>::type b1;
+      B<T2, T1, I>::type b2; // expected-error {{missing 'typename'}}
+
+      typedef T1 my_T1;
+      static const int my_I = I;
+      static const int my_I2 = I+0;
+      static const int my_I3 = my_I;
+      B<my_T1, T2, my_I>::type b3; // FIXME: expected-error {{missing 'typename'}}
+      B<my_T1, T2, my_I2>::type b4; // expected-error {{missing 'typename'}}
+      B<my_T1, T2, my_I3>::type b5; // FIXME: expected-error {{missing 'typename'}}
+    };
+  }
+
+  namespace example2 {
+    template <int, typename T> struct X { typedef T type; };
+    template <class T> class A {
+      static const int i = 5;
+      X<i, int>::type w; // FIXME: expected-error {{missing 'typename'}}
+      X<A::i, char>::type x; // FIXME: expected-error {{missing 'typename'}}
+      X<A<T>::i, double>::type y; // FIXME: expected-error {{missing 'typename'}}
+      X<A<T*>::i, long>::type z; // expected-error {{missing 'typename'}}
+      int f();
+    };
+    template <class T> int A<T>::f() {
+      return i;
+    }
+  }
+}
+
+// dr225: yes
+template<typename T> void dr225_f(T t) { dr225_g(t); } // expected-error {{call to function 'dr225_g' that is neither visible in the template definition nor found by argument-dependent lookup}}
+void dr225_g(int); // expected-note {{should be declared prior to the call site}}
+template void dr225_f(int); // expected-note {{in instantiation of}}
+
+namespace dr226 { // dr226: no
+  template<typename T = void> void f() {}
+#if __cplusplus < 201103L
+  // expected-error at -2 {{extension}}
+  // FIXME: This appears to be wrong: default arguments for function templates
+  // are listed as a defect (in c++98) not an extension. EDG accepts them in
+  // strict c++98 mode.
+#endif
+  template<typename T> struct S {
+    template<typename U = void> void g();
+#if __cplusplus < 201103L
+  // expected-error at -2 {{extension}}
+#endif
+    template<typename U> struct X;
+    template<typename U> void h();
+  };
+  template<typename T> template<typename U> void S<T>::g() {}
+  template<typename T> template<typename U = void> struct S<T>::X {}; // expected-error {{cannot add a default template arg}}
+  template<typename T> template<typename U = void> void S<T>::h() {} // expected-error {{cannot add a default template arg}}
+
+  template<typename> void friend_h();
+  struct A {
+    // FIXME: This is ill-formed.
+    template<typename=void> struct friend_B;
+    // FIXME: f, h, and i are ill-formed.
+    //  f is ill-formed because it is not a definition.
+    //  h and i are ill-formed because they are not the only declarations of the
+    //  function in the translation unit.
+    template<typename=void> void friend_f();
+    template<typename=void> void friend_g() {}
+    template<typename=void> void friend_h() {}
+    template<typename=void> void friend_i() {}
+#if __cplusplus < 201103L
+  // expected-error at -5 {{extension}} expected-error at -4 {{extension}}
+  // expected-error at -4 {{extension}} expected-error at -3 {{extension}}
+#endif
+  };
+  template<typename> void friend_i();
+
+  template<typename=void, typename X> void foo(X) {}
+  template<typename=void, typename X> struct Foo {}; // expected-error {{missing a default argument}} expected-note {{here}}
+#if __cplusplus < 201103L
+  // expected-error at -3 {{extension}}
+#endif
+
+  template<typename=void, typename X, typename, typename Y> int foo(X, Y);
+  template<typename, typename X, typename=void, typename Y> int foo(X, Y);
+  int x = foo(0, 0);
+#if __cplusplus < 201103L
+  // expected-error at -4 {{extension}}
+  // expected-error at -4 {{extension}}
+#endif
+}
+
+void dr227(bool b) { // dr227: yes
+  if (b)
+    int n;
+  else
+    int n;
+}
+
+namespace dr228 { // dr228: yes
+  template <class T> struct X {
+    void f();
+  };
+  template <class T> struct Y {
+    void g(X<T> x) { x.template X<T>::f(); }
+  };
+}
+
+namespace dr229 { // dr229: yes
+  template<typename T> void f();
+  template<typename T> void f<T*>() {} // expected-error {{function template partial specialization}}
+  template<> void f<int>() {}
+}
+
+namespace dr231 { // dr231: yes
+  namespace outer {
+    namespace inner {
+      int i; // expected-note {{here}}
+    }
+    void f() { using namespace inner; }
+    int j = i; // expected-error {{undeclared identifier 'i'; did you mean 'inner::i'?}}
+  }
+}
+
+// dr234: na
+// dr235: na
+
+namespace dr236 { // dr236: yes
+  void *p = int();
+#if __cplusplus < 201103L
+  // expected-warning at -2 {{null pointer}}
+#else
+  // expected-error at -4 {{cannot initialize}}
+#endif
+}
+
+namespace dr237 { // dr237: dup 470
+  template<typename T> struct A { void f() { T::error; } };
+  template<typename T> struct B : A<T> {};
+  template struct B<int>; // ok
+}
+
+namespace dr239 { // dr239: yes
+  namespace NS {
+    class T {};
+    void f(T);
+    float &g(T, int);
+  }
+  NS::T parm;
+  int &g(NS::T, float);
+  int main() {
+    f(parm);
+    float &r = g(parm, 1);
+    extern int &g(NS::T, float);
+    int &s = g(parm, 1);
+  }
+}
+
+// dr240: dup 616

Modified: cfe/trunk/www/cxx_dr_status.html
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/www/cxx_dr_status.html?rev=194946&r1=194945&r2=194946&view=diff
==============================================================================
--- cfe/trunk/www/cxx_dr_status.html (original)
+++ cfe/trunk/www/cxx_dr_status.html Sat Nov 16 20:50:30 2013
@@ -110,7 +110,7 @@
     <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_closed.html#12">12</a></td>
     <td>dup</td>
     <td>Default arguments on different declarations for the same function and the Koenig lookup</td>
-    <td class="none" align="center">Superseded by 239</td>
+    <td class="full" align="center">Superseded by 239</td>
   </tr>
   <tr class="open">
     <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_closed.html#13">13</a></td>
@@ -1383,37 +1383,37 @@ accessible?</td>
     <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#224">224</a></td>
     <td>CD1</td>
     <td>Definition of dependent names</td>
-    <td class="none" align="center">Unknown</td>
+    <td class="none" align="center">No</td>
   </tr>
   <tr>
     <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_closed.html#225">225</a></td>
     <td>NAD</td>
     <td>Koenig lookup and fundamental types</td>
-    <td class="none" align="center">Unknown</td>
+    <td class="full" align="center">Yes</td>
   </tr>
   <tr>
     <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#226">226</a></td>
     <td>CD1</td>
     <td>Default template arguments for function templates</td>
-    <td class="none" align="center">Unknown</td>
+    <td class="none" align="center">No</td>
   </tr>
   <tr>
     <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#227">227</a></td>
     <td>TC1</td>
     <td>How many scopes in an <TT>if</TT> statement?</td>
-    <td class="none" align="center">Unknown</td>
+    <td class="full" align="center">Yes</td>
   </tr>
   <tr>
     <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#228">228</a></td>
     <td>CD1</td>
     <td>Use of <TT>template</TT> keyword with non-member templates</td>
-    <td class="none" align="center">Unknown</td>
+    <td class="full" align="center">Yes</td>
   </tr>
   <tr>
     <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_closed.html#229">229</a></td>
     <td>NAD</td>
     <td>Partial specialization of function templates</td>
-    <td class="none" align="center">Unknown</td>
+    <td class="full" align="center">Yes</td>
   </tr>
   <tr class="open">
     <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_closed.html#230">230</a></td>
@@ -1425,7 +1425,7 @@ accessible?</td>
     <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_closed.html#231">231</a></td>
     <td>NAD</td>
     <td>Visibility of names after <I>using-directive</I>s</td>
-    <td class="none" align="center">Unknown</td>
+    <td class="full" align="center">Yes</td>
   </tr>
   <tr class="open">
     <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#232">232</a></td>
@@ -1443,25 +1443,25 @@ accessible?</td>
     <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_closed.html#234">234</a></td>
     <td>NAD</td>
     <td>Reuse of base class subobjects</td>
-    <td class="none" align="center">Unknown</td>
+    <td class="na" align="center">N/A</td>
   </tr>
   <tr>
     <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#235">235</a></td>
     <td>TC1</td>
     <td>Assignment vs initialization</td>
-    <td class="none" align="center">Unknown</td>
+    <td class="na" align="center">N/A</td>
   </tr>
   <tr>
     <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_closed.html#236">236</a></td>
     <td>NAD</td>
     <td>Explicit temporaries and integral constant expressions</td>
-    <td class="none" align="center">Unknown</td>
+    <td class="full" align="center">Yes</td>
   </tr>
   <tr>
     <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#237">237</a></td>
     <td>CD1</td>
     <td>Explicit instantiation and base class members</td>
-    <td class="none" align="center">Unknown</td>
+    <td class="none" align="center">Duplicate of 470</td>
   </tr>
   <tr class="open">
     <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#238">238</a></td>
@@ -1473,13 +1473,13 @@ accessible?</td>
     <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#239">239</a></td>
     <td>CD1</td>
     <td>Footnote 116 and Koenig lookup</td>
-    <td class="none" align="center">Unknown</td>
+    <td class="full" align="center">Yes</td>
   </tr>
   <tr>
     <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#240">240</a></td>
     <td>DRWP</td>
     <td>Uninitialized values and undefined behavior</td>
-    <td class="none" align="center">Unknown</td>
+    <td class="none" align="center">Duplicate of 616</td>
   </tr>
   <tr>
     <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#241">241</a></td>





More information about the cfe-commits mailing list