r204217 - Tests for DR450-475.

Richard Smith richard-llvm at metafoo.co.uk
Wed Mar 19 01:04:12 PDT 2014


Author: rsmith
Date: Wed Mar 19 03:04:12 2014
New Revision: 204217

URL: http://llvm.org/viewvc/llvm-project?rev=204217&view=rev
Log:
Tests for DR450-475.

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

Modified: cfe/trunk/test/CXX/drs/dr4xx.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CXX/drs/dr4xx.cpp?rev=204217&r1=204216&r2=204217&view=diff
==============================================================================
--- cfe/trunk/test/CXX/drs/dr4xx.cpp (original)
+++ cfe/trunk/test/CXX/drs/dr4xx.cpp Wed Mar 19 03:04:12 2014
@@ -603,6 +603,236 @@ namespace dr450 { // dr450: yes
 #endif
 }
 
+namespace dr451 { // dr451: yes
+  const int a = 1 / 0; // expected-warning {{undefined}}
+  const int b = 1 / 0; // expected-warning {{undefined}}
+  int arr[b]; // expected-error +{{variable length arr}}
+}
+
+namespace dr452 { // dr452: yes
+  struct A {
+    int a, b, c;
+    A *p;
+    int f();
+    A() : a(f()), b(this->f() + a), c(this->a), p(this) {}
+  };
+}
+
+// dr454 FIXME write a codegen test
+
+namespace dr456 { // dr456: yes
+  // sup 903 c++11
+  const int null = 0;
+  void *p = null;
+#if __cplusplus >= 201103L
+  // expected-error at -2 {{cannot initialize}}
+#else
+  // expected-warning at -4 {{null}}
+#endif
+
+  const bool f = false;
+  void *q = f;
+#if __cplusplus >= 201103L
+  // expected-error at -2 {{cannot initialize}}
+#else
+  // expected-warning at -4 {{null}}
+#endif
+}
+
+namespace dr457 { // dr457: yes
+  const int a = 1;
+  const volatile int b = 1;
+  int ax[a];
+  int bx[b]; // expected-error +{{variable length array}}
+
+  enum E {
+    ea = a,
+    eb = b // expected-error {{not an integral constant}} expected-note {{read of volatile-qualified}}
+  };
+}
+
+namespace dr458 { // dr458: no
+  struct A {
+    int T;
+    int f();
+    template<typename> int g();
+  };
+
+  template<typename> struct B : A {
+    int f();
+    template<typename> int g();
+    template<typename> int h();
+  };
+
+  int A::f() {
+    return T;
+  }
+  template<typename T>
+  int A::g() {
+    return T; // FIXME: this is invalid, it finds the template parameter
+  }
+
+  template<typename T>
+  int B<T>::f() {
+    return T;
+  }
+  template<typename T> template<typename U>
+  int B<T>::g() {
+    return T;
+  }
+  template<typename U> template<typename T>
+  int B<U>::h() {
+    return T; // FIXME: this is invalid, it finds the template parameter
+  }
+}
+
+namespace dr460 { // dr460: yes
+  namespace X { namespace Q { int n; } }
+  namespace Y {
+    using X; // expected-error {{requires a qualified name}}
+    using dr460::X; // expected-error {{cannot refer to namespace}}
+    using X::Q; // expected-error {{cannot refer to namespace}}
+  }
+}
+
+// dr461: na
+// dr462 FIXME write a codegen test
+// dr463: na
+// dr464: na
+// dr465: na
+
+namespace dr466 { // dr466: no
+  typedef int I;
+  typedef const int CI;
+  typedef volatile int VI;
+  void f(int *a, CI *b, VI *c) {
+    a->~I();
+    a->~CI();
+    a->~VI();
+    a->I::~I();
+    a->CI::~CI();
+    a->VI::~VI();
+
+    a->CI::~VI(); // FIXME: This is invalid; CI and VI are not the same scalar type.
+
+    b->~I();
+    b->~CI();
+    b->~VI();
+    b->I::~I();
+    b->CI::~CI();
+    b->VI::~VI();
+
+    c->~I();
+    c->~CI();
+    c->~VI();
+    c->I::~I();
+    c->CI::~CI();
+    c->VI::~VI();
+  }
+}
+
+namespace dr467 { // dr467: yes
+  int stuff();
+
+  int f() {
+    static bool done;
+    if (done)
+      goto later;
+    static int k = stuff();
+    done = true;
+  later:
+    return k;
+  }
+  int g() {
+    goto later; // expected-error {{protected scope}}
+    int k = stuff(); // expected-note {{bypasses variable initialization}}
+  later:
+    return k;
+  }
+}
+
+namespace dr468 { // dr468: yes c++11
+  // FIXME: Should we allow this in C++98 too?
+  template<typename> struct A {
+    template<typename> struct B {
+      static int C;
+    };
+  };
+  int k = dr468::template A<int>::template B<char>::C;
+#if __cplusplus < 201103L
+  // expected-error at -2 2{{'template' keyword outside of a template}}
+#endif
+}
+
+namespace dr469 { // dr469: no
+  // FIXME: The core issue here didn't really answer the question. We don't
+  // deduce 'const T' from a function or reference type in a class template...
+  template<typename T> struct X; // expected-note 2{{here}}
+  template<typename T> struct X<const T> {};
+  X<int&> x; // expected-error {{undefined}}
+  X<int()> y; // expected-error {{undefined}}
+
+  // ... but we do in a function template. GCC and EDG fail deduction of 'f'
+  // and the second 'h'.
+  template<typename T> void f(const T *);
+  template<typename T> void g(T *, const T * = 0);
+  template<typename T> void h(T *) { T::error; }
+  template<typename T> void h(const T *);
+  void i() {
+    f(&i);
+    g(&i);
+    h(&i);
+  }
+}
+
+namespace dr470 { // dr470: yes
+  template<typename T> struct A {
+    struct B {};
+  };
+  template<typename T> struct C {
+  };
+
+  template struct A<int>; // expected-note {{previous}}
+  template struct A<int>::B; // expected-error {{duplicate explicit instantiation}}
+
+  // ok, instantiating C<char> doesn't instantiate base class members.
+  template struct A<char>;
+  template struct C<char>;
+}
+
+namespace dr471 { // dr471: yes
+  struct A { int n; };
+  struct B : private virtual A {};
+  struct C : protected virtual A {};
+  struct D : B, C { int f() { return n; } };
+  struct E : private virtual A {
+    using A::n;
+  };
+  struct F : E, B { int f() { return n; } };
+  struct G : virtual A {
+  private:
+    using A::n; // expected-note {{here}}
+  };
+  struct H : B, G { int f() { return n; } }; // expected-error {{private}}
+}
+
+namespace dr474 { // dr474: yes
+  namespace N {
+    struct S {
+      void f();
+    };
+  }
+  void N::S::f() {
+    void g(); // expected-note {{previous}}
+  }
+  int g();
+  namespace N {
+    int g(); // expected-error {{cannot be overloaded}}
+  }
+}
+
+// dr475 FIXME write a codegen test
+
 namespace dr482 { // dr482: 3.5
   extern int a;
   void f();

Modified: cfe/trunk/www/cxx_dr_status.html
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/www/cxx_dr_status.html?rev=204217&r1=204216&r2=204217&view=diff
==============================================================================
--- cfe/trunk/www/cxx_dr_status.html (original)
+++ cfe/trunk/www/cxx_dr_status.html Wed Mar 19 03:04:12 2014
@@ -219,7 +219,7 @@
     <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#30">30</a></td>
     <td>TC1</td>
     <td>Valid uses of "<TT>::template</TT>"</td>
-    <td class="none" align="center">Superseded by <a href="#468">468</a> (C++11 onwards)</td>
+    <td class="full" align="center">Superseded by <a href="#468">468</a> (C++11 onwards)</td>
   </tr>
   <tr id="31">
     <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_closed.html#31">31</a></td>
@@ -1462,7 +1462,7 @@ accessible?</td>
     <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">Duplicate of <a href="#470">470</a></td>
+    <td class="full" align="center">Duplicate of <a href="#470">470</a></td>
   </tr>
   <tr class="open" id="238">
     <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#238">238</a></td>
@@ -2747,13 +2747,13 @@ of class templates</td>
     <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#451">451</a></td>
     <td>CD1</td>
     <td>Expressions with invalid results and ill-formedness</td>
-    <td class="none" align="center">Unknown</td>
+    <td class="full" align="center">Yes</td>
   </tr>
   <tr id="452">
     <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#452">452</a></td>
     <td>CD1</td>
     <td>Wording nit on description of <TT>this</TT></td>
-    <td class="none" align="center">Unknown</td>
+    <td class="full" align="center">Yes</td>
   </tr>
   <tr class="open" id="453">
     <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#453">453</a></td>
@@ -2777,19 +2777,19 @@ of class templates</td>
     <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_closed.html#456">456</a></td>
     <td>NAD</td>
     <td>Is initialized const int or const bool variable a null pointer constant?</td>
-    <td class="none" align="center">Unknown</td>
+    <td class="full" align="center">Yes</td>
   </tr>
   <tr id="457">
     <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#457">457</a></td>
     <td>CD1</td>
     <td>Wording nit on use of const variables in constant expressions</td>
-    <td class="none" align="center">Unknown</td>
+    <td class="full" align="center">Yes</td>
   </tr>
   <tr id="458">
     <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#458">458</a></td>
     <td>C++11</td>
     <td>Hiding of member template parameters by other members</td>
-    <td class="none" align="center">Unknown</td>
+    <td class="none" align="center">No</td>
   </tr>
   <tr class="open" id="459">
     <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#459">459</a></td>
@@ -2801,13 +2801,13 @@ of class templates</td>
     <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#460">460</a></td>
     <td>CD1</td>
     <td>Can a <I>using-declaration</I> name a namespace?</td>
-    <td class="none" align="center">Unknown</td>
+    <td class="full" align="center">Yes</td>
   </tr>
   <tr id="461">
     <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_closed.html#461">461</a></td>
     <td>NAD</td>
     <td>Make <TT>asm</TT> conditionally-supported</td>
-    <td class="none" align="center">Unknown</td>
+    <td class="na" align="center">N/A</td>
   </tr>
   <tr id="462">
     <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#462">462</a></td>
@@ -2819,55 +2819,55 @@ of class templates</td>
     <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#463">463</a></td>
     <td>CD1</td>
     <td><TT>reinterpret_cast<T*>(0)</TT></td>
-    <td class="none" align="center">Unknown</td>
+    <td class="na" align="center">N/A</td>
   </tr>
   <tr id="464">
     <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#464">464</a></td>
     <td>CD1</td>
     <td>Wording nit on lifetime of temporaries to which references are bound</td>
-    <td class="none" align="center">Unknown</td>
+    <td class="na" align="center">N/A</td>
   </tr>
   <tr id="465">
     <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_closed.html#465">465</a></td>
     <td>NAD</td>
     <td>May constructors of global objects call <TT>exit()</TT>?</td>
-    <td class="none" align="center">Unknown</td>
+    <td class="na" align="center">N/A</td>
   </tr>
   <tr id="466">
     <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#466">466</a></td>
     <td>CD1</td>
     <td>cv-qualifiers on pseudo-destructor type</td>
-    <td class="none" align="center">Unknown</td>
+    <td class="none" align="center">No</td>
   </tr>
   <tr id="467">
     <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_closed.html#467">467</a></td>
     <td>NAD</td>
     <td>Jump past initialization of local static variable</td>
-    <td class="none" align="center">Unknown</td>
+    <td class="full" align="center">Yes</td>
   </tr>
   <tr id="468">
     <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#468">468</a></td>
     <td>CD1</td>
     <td>Allow <TT>::template</TT> outside of templates</td>
-    <td class="none" align="center">Unknown</td>
+    <td class="full" align="center">Yes (C++11 onwards)</td>
   </tr>
   <tr id="469">
     <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_closed.html#469">469</a></td>
     <td>NAD</td>
     <td>Const template specializations and reference arguments</td>
-    <td class="none" align="center">Unknown</td>
+    <td class="none" align="center">No</td>
   </tr>
   <tr id="470">
     <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#470">470</a></td>
     <td>CD1</td>
     <td>Instantiation of members of an explicitly-instantiated class template</td>
-    <td class="none" align="center">Unknown</td>
+    <td class="full" align="center">Yes</td>
   </tr>
   <tr id="471">
     <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_closed.html#471">471</a></td>
     <td>NAD</td>
     <td>Conflicting inherited access specifications</td>
-    <td class="none" align="center">Unknown</td>
+    <td class="full" align="center">Yes</td>
   </tr>
   <tr class="open" id="472">
     <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#472">472</a></td>
@@ -2885,7 +2885,7 @@ of class templates</td>
     <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#474">474</a></td>
     <td>CD1</td>
     <td>Block-scope <TT>extern</TT> declarations in namespace members</td>
-    <td class="none" align="center">Unknown</td>
+    <td class="full" align="center">Yes</td>
   </tr>
   <tr id="475">
     <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#475">475</a></td>





More information about the cfe-commits mailing list