[PATCH] Fix PR20495: correct inference of the CUDA target for implicit members

Richard Smith richard at metafoo.co.uk
Fri Sep 5 14:24:05 PDT 2014


This should have more test coverage: at least cover each different kind of special member function, const/non-const arguments, explicitly-defaulted functions, and cases where a special member of a derived class is deleted because the base class's special member would call functions with a `__host__` / `__device__` mismatch.

================
Comment at: lib/Sema/SemaCUDA.cpp:123-133
@@ +122,13 @@
+  llvm::SmallVector<const CXXBaseSpecifier *, 16> Bases;
+  for (const auto &B : ClassDecl->bases()) {
+    if (!ClassDecl->isAbstract() || !B.isVirtual()) {
+      Bases.push_back(&B);
+    }
+  }
+
+  if (!ClassDecl->isAbstract()) {
+    for (const auto &VB : ClassDecl->vbases()) {
+      Bases.push_back(&VB);
+    }
+  }
+
----------------
For a non-abstract class, you'll collect direct vbases twice here (once from the bases list and once from the vbases list). The easiest thing to do would be to change the condition in the first loop to just

  if (!B.isVirtual())

================
Comment at: lib/Sema/SemaCUDA.cpp:164
@@ +163,3 @@
+          Diag(ClassDecl->getLocation(),
+               diag::err_implicit_member_target_infer_collision)
+              << (unsigned)CSM << InferredTarget.getValue()
----------------
This should be a note, rather than an error.

================
Comment at: lib/Sema/SemaDeclCXX.cpp:5568-5574
@@ +5567,9 @@
+    // failed.
+    bool Const = false;
+    if ((CSM == CXXCopyConstructor &&
+         RD->implicitCopyConstructorHasConstParam()) ||
+        (CSM == CXXCopyAssignment &&
+         RD->implicitCopyAssignmentHasConstParam())) {
+      Const = true;
+    }
+    return inferCUDATargetForImplicitSpecialMember(RD, CSM, MD, Const,
----------------
This is `SMI.ConstArg`.

================
Comment at: lib/Sema/SemaOverload.cpp:5638
@@ +5637,3 @@
+      // Skip the check for callers that are implicit members, because in this
+      // case we still don't know what the member's target is; the target is
+      // inferred for the member automatically, based on the bases and fields of
----------------
s/we still don't know/we may not yet know/

http://reviews.llvm.org/D5199






More information about the cfe-commits mailing list