[PATCH] D37308: Fix the __interface inheritence rules to work better with IUnknown and IDispatch

Erich Keane via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Thu Sep 14 12:48:19 PDT 2017


erichkeane marked 4 inline comments as done.
erichkeane added a comment.

Thanks for the quick  response!  New patch coming soon.



================
Comment at: lib/AST/DeclCXX.cpp:1478
+
+  // No interface-like types can have a user declared constructor, destructor,
+  // friends, VBases, conersion functions, or fields.  Additionally, lambdas
----------------
rnk wrote:
> Maybe "Interface-like types cannot have ..."
> 
> Can an interface-like type have an explicitly defaulted copy ctor? That will be user declared, but it will probably be trivial.
It cannot according to godbolt. https://godbolt.org/g/wZuNzT


================
Comment at: lib/AST/DeclCXX.cpp:1486-1489
+  // No interface-like type can have a method with a definition.
+  for (const auto *const Method : methods())
+    if (Method->isDefined())
+      return false;
----------------
rnk wrote:
> Huh, so they can be declared, but they don't have to be pure.
Correct, and strange.  Annoyingly, it is possible to do:

  struct S : someIFace {
  void foo();
  };
    __interface F  : public S {}; // This one is OK.
    void S::foo();
    __interface F2  : public S {}; // This one is NOT OK.


================
Comment at: lib/AST/DeclCXX.cpp:1516-1517
+    const auto *Base = BS.getType()->getAsCXXRecordDecl();
+    if (Base->isInterface())
+      continue;
+    if (Base->isInterfaceLike()) {
----------------
rnk wrote:
> Are you sure you want this? MSVC rejects the test case that exercises this case.
AM I sure?   Not anymore.  WAS I sure?  Pretty darn.  Thanks for the catch!


================
Comment at: test/SemaCXX/ms-iunknown-outofline-def.cpp:9-10
+void IUnknown::foo() {}
+// expected-error at +1{{interface type cannot inherit from}}
+__interface HasError : public IUnknown {}; 
----------------
rnk wrote:
> Again, this is a pretty weird error. If the method isn't pure, there must be a definition *somewhere* in the program, unless interface types are always declared with novtable.
Yeah, I agree.  I have no idea if I can limit this to just pure functions, since I'm not totally sure about the use cases.  We have at least 1 test in our testbase that isn't virtual, but the context has been lost (might have been minimized from another repro).


https://reviews.llvm.org/D37308





More information about the cfe-commits mailing list