[PATCH] Fix for PR18393 - emit error when abstract type is returned by value

Robert Matusewicz matekm at gmail.com
Mon Aug 4 00:14:55 PDT 2014


Hi,



2014-08-03 18:33 GMT+02:00 Arthur O'Dwyer <arthur.j.odwyer at gmail.com>:

> Does this reject valid C++ code involving templates?  I.e., is there
> any wording in the Standard that says this kind of code *can* be
> rejected, or are these declarations expected to compile quietly?
>
>
No, it doesn't, the following code isn't rejected by the clang after
applying my patch:


  1
  2 struct C
  3 {

  4     typedef C type;
  5     virtual void foo() = 0;
  6 };
  7
  8 template<class T>
  9 struct X
 10 {

 11     typename T::type mytype();
 12 };



It's hard to reject that as, AFAIK, we can look into dependent type at this
point (but I'm not sure of that).



> I don't see anything wrong with returning an instance of an abstract
> type, in principle. The type system shouldn't care about that sort of
> thing.
>
>
The standard states that "An abstract class shall not be used as a
parameter type, as a function return type, or as the type of an explicit
conversion" (found this in January 2012 draft, class.abstract $10.4.3)

This patch is the easiest way to fix the problem. Probably, I could try to
fix it other way, but then I would need to hunt for some special cases, e.g:

  1 struct A {
  2       virtual int f() = 0;
  3 };
  4
  5 struct C : A
  6 {
  7     virtual int f() { return 5; }
  8 };
  9
 10 struct B {
 11       A f() { C a; return a;}
 12 };
 13
 14 int main()
 15 {
 16     B b;
 17     b.f();
 18     return 0;
 19 }


Br,
Robert Matusewicz
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20140804/8ba3d0ed/attachment.html>


More information about the cfe-commits mailing list