r217606 - Tests for DR573-580.
Richard Smith
richard at metafoo.co.uk
Thu Sep 11 13:52:06 PDT 2014
On 11 Sep 2014 11:05, "Ismail Pazarbasi" <ismail.pazarbasi at gmail.com> wrote:
>
> Richard,
>
> I thought we were supporting DR580 since last year.
We more or less are, but the test uncovered a bug. See the FIXME.
> r180707 - Implement DR580: access checks for template parameters of a
> class template
>
> On Thu, Sep 11, 2014 at 7:28 PM, Richard Smith
> <richard-llvm at metafoo.co.uk> wrote:
> > Author: rsmith
> > Date: Thu Sep 11 12:28:14 2014
> > New Revision: 217606
> >
> > URL: http://llvm.org/viewvc/llvm-project?rev=217606&view=rev
> > Log:
> > Tests for DR573-580.
> >
> > Modified:
> > cfe/trunk/test/CXX/drs/dr5xx.cpp
> > cfe/trunk/www/cxx_dr_status.html
> >
> > Modified: cfe/trunk/test/CXX/drs/dr5xx.cpp
> > URL:
http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CXX/drs/dr5xx.cpp?rev=217606&r1=217605&r2=217606&view=diff
> >
==============================================================================
> > --- cfe/trunk/test/CXX/drs/dr5xx.cpp (original)
> > +++ cfe/trunk/test/CXX/drs/dr5xx.cpp Thu Sep 11 12:28:14 2014
> > @@ -726,3 +726,129 @@ namespace dr572 { // dr572: yes
> > enum E { a = 1, b = 2 };
> > int check[a + b == 3 ? 1 : -1];
> > }
> > +
> > +namespace dr573 { // dr573: no
> > + void *a;
> > + int *b = reinterpret_cast<int*>(a);
> > + void (*c)() = reinterpret_cast<void(*)()>(a);
> > + void *d = reinterpret_cast<void*>(c);
> > +#if __cplusplus < 201103L
> > + // expected-error at -3 {{extension}}
> > + // expected-error at -3 {{extension}}
> > +#endif
> > + void f() { delete a; } // expected-error {{cannot delete}}
> > + int n = d - a; // expected-error {{arithmetic on pointers to void}}
> > + // FIXME: This is ill-formed.
> > + template<void*> struct S;
> > + template<int*> struct T;
> > +}
> > +
> > +namespace dr574 { // dr574: yes
> > + struct A {
> > + A &operator=(const A&) const; // expected-note {{does not match
because it is const}}
> > + };
> > + struct B {
> > + B &operator=(const B&) volatile; // expected-note {{nearly
matches}}
> > + };
> > +#if __cplusplus >= 201103L
> > + struct C {
> > + C &operator=(const C&) &; // expected-note {{not viable}}
expected-note {{nearly matches}} expected-note {{here}}
> > + };
> > + struct D {
> > + D &operator=(const D&) &&; // expected-note {{not viable}}
expected-note {{nearly matches}} expected-note {{here}}
> > + };
> > + void test(C c, D d) {
> > + c = c;
> > + C() = c; // expected-error {{no viable}}
> > + d = d; // expected-error {{no viable}}
> > + D() = d;
> > + }
> > +#endif
> > + struct Test {
> > + friend A &A::operator=(const A&); // expected-error {{does not
match}}
> > + friend B &B::operator=(const B&); // expected-error {{does not
match}}
> > +#if __cplusplus >= 201103L
> > + // FIXME: We shouldn't produce the 'cannot overload' diagnostics
here.
> > + friend C &C::operator=(const C&); // expected-error {{does not
match}} expected-error {{cannot overload}}
> > + friend D &D::operator=(const D&); // expected-error {{does not
match}} expected-error {{cannot overload}}
> > +#endif
> > + };
> > +}
> > +
> > +namespace dr575 { // dr575: yes
> > + template<typename T, typename U = typename T::type> void a(T); void
a(...); // expected-error 0-1{{extension}}
> > + template<typename T, typename T::type U = 0> void b(T); void b(...);
// expected-error 0-1{{extension}}
> > + template<typename T, int U = T::value> void c(T); void c(...); //
expected-error 0-1{{extension}}
> > + template<typename T> void d(T, int = T::value); void d(...); //
expected-error {{cannot be used prior to '::'}}
> > + void x() {
> > + a(0);
> > + b(0);
> > + c(0);
> > + d(0); // expected-note {{in instantiation of default function
argument}}
> > + }
> > +
> > + template<typename T = int&> void f(T* = 0); // expected-error
0-1{{extension}}
> > + template<typename T = int> void f(T = 0); // expected-error
0-1{{extension}}
> > + void g() { f<>(); }
> > +
> > + template<typename T> T &h(T *);
> > + template<typename T> T *h(T *);
> > + void *p = h((void*)0);
> > +}
> > +
> > +namespace dr576 { // dr576: yes
> > + typedef void f() {} // expected-error {{function definition is not
allowed}}
> > + void f(typedef int n); // expected-error {{invalid storage class}}
> > + void f(char c) { typedef int n; }
> > +}
> > +
> > +namespace dr577 { // dr577: yes
> > + typedef void V;
> > + typedef const void CV;
> > + void a(void);
> > + void b(const void); // expected-error {{qualifiers}}
> > + void c(V);
> > + void d(CV); // expected-error {{qualifiers}}
> > + void (*e)(void) = c;
> > + void (*f)(const void); // expected-error {{qualifiers}}
> > + void (*g)(V) = a;
> > + void (*h)(CV); // expected-error {{qualifiers}}
> > + template<typename T> void i(T); // expected-note 2{{requires 1 arg}}
> > + template<typename T> void j(void (*)(T)); // expected-note
2{{argument may not have 'void' type}}
> > + void k() {
> > + a();
> > + c();
> > + i<void>(); // expected-error {{no match}}
> > + i<const void>(); // expected-error {{no match}}
> > + j<void>(0); // expected-error {{no match}}
> > + j<const void>(0); // expected-error {{no match}}
> > + }
> > +}
> > +
> > +namespace dr580 { // dr580: no
> > + class C;
> > + struct A { static C c; };
> > + struct B { static C c; };
> > + class C {
> > + C(); // expected-note {{here}}
> > + ~C(); // expected-note {{here}}
> > +
> > + typedef int I; // expected-note {{here}}
> > + template<int> struct X;
> > + template<int> friend struct Y;
> > + template<int> void f();
> > + template<int> friend void g();
> > + friend struct A;
> > + };
> > +
> > + template<C::I> struct C::X {};
> > + template<C::I> struct Y {};
> > + template<C::I> struct Z {}; // FIXME: should reject, accepted
because C befriends A!
> > +
> > + template<C::I> void C::f() {}
> > + template<C::I> void g() {}
> > + template<C::I> void h() {} // expected-error {{private}}
> > +
> > + C A::c;
> > + C B::c; // expected-error 2{{private}}
> > +}
> >
> > Modified: cfe/trunk/www/cxx_dr_status.html
> > URL:
http://llvm.org/viewvc/llvm-project/cfe/trunk/www/cxx_dr_status.html?rev=217606&r1=217605&r2=217606&view=diff
> >
==============================================================================
> > --- cfe/trunk/www/cxx_dr_status.html (original)
> > +++ cfe/trunk/www/cxx_dr_status.html Thu Sep 11 12:28:14 2014
> > @@ -147,7 +147,7 @@
> > <td><a href="
http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_closed.html#18">18</a></td>
> > <td>NAD</td>
> > <td>f(TYPE) where TYPE is void should be allowed</td>
> > - <td class="none" align="center">Superseded by <a
href="#577">577</a></td>
> > + <td class="full" align="center">Superseded by <a
href="#577">577</a></td>
> > </tr>
> > <tr id="19">
> > <td><a href="
http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_closed.html#19">19</a></td>
> > @@ -2033,7 +2033,7 @@ of class templates</td>
> > <td><a href="
http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#332
">332</a></td>
> > <td>CD3</td>
> > <td>cv-qualified <TT>void</TT> parameter types</td>
> > - <td class="none" align="center">Duplicate of <a
href="#577">577</a></td>
> > + <td class="full" align="center">Duplicate of <a
href="#577">577</a></td>
> > </tr>
> > <tr id="333">
> > <td><a href="
http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_closed.html#333
">333</a></td>
> > @@ -3481,31 +3481,31 @@ and <I>POD class</I></td>
> > <td><a href="
http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#573
">573</a></td>
> > <td>C++11</td>
> > <td>Conversions between function pointers and <TT>void*</TT></td>
> > - <td class="none" align="center">Unknown</td>
> > + <td class="none" align="center">No</td>
> > </tr>
> > <tr id="574">
> > <td><a href="
http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_closed.html#574
">574</a></td>
> > <td>NAD</td>
> > <td>Definition of “copy assignment operator”</td>
> > - <td class="none" align="center">Unknown</td>
> > + <td class="full" align="center">Yes</td>
> > </tr>
> > <tr id="575">
> > <td><a href="
http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#575
">575</a></td>
> > <td>C++11</td>
> > <td>Criteria for deduction failure</td>
> > - <td class="none" align="center">Unknown</td>
> > + <td class="full" align="center">Yes</td>
> > </tr>
> > <tr id="576">
> > <td><a href="
http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#576
">576</a></td>
> > <td>CD2</td>
> > <td>Typedefs in function definitions</td>
> > - <td class="none" align="center">Unknown</td>
> > + <td class="full" align="center">Yes</td>
> > </tr>
> > <tr id="577">
> > <td><a href="
http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#577
">577</a></td>
> > <td>CD3</td>
> > <td><TT>void</TT> in an empty parameter list</td>
> > - <td class="none" align="center">Unknown</td>
> > + <td class="full" align="center">Yes</td>
> > </tr>
> > <tr class="open" id="578">
> > <td><a href="
http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#578
">578</a></td>
> > @@ -3523,7 +3523,7 @@ and <I>POD class</I></td>
> > <td><a href="
http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#580
">580</a></td>
> > <td>C++11</td>
> > <td>Access in <I>template-parameter</I>s of member and friend
definitions</td>
> > - <td class="none" align="center">Unknown</td>
> > + <td class="none" align="center">No</td>
> > </tr>
> > <tr class="open" id="581">
> > <td><a href="
http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#581
">581</a></td>
> >
> >
> > _______________________________________________
> > cfe-commits mailing list
> > cfe-commits at cs.uiuc.edu
> > http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20140911/5f5adc62/attachment.html>
More information about the cfe-commits
mailing list