================
Comment at: lib/Sema/SemaCUDA.cpp:110-111
@@ +109,4 @@
+                                                    bool ConstRHS) {
+  CUDAFunctionTarget InferredTarget;
+  bool HasInferredTarget = false;
+
----------------
`Optional<CUDAFunctionTarget>` InferredTarget;

================
Comment at: lib/Sema/SemaCUDA.cpp:119
@@ +118,3 @@
+  // Infer the target of this member base on the ones it should call.
+  for (const auto &B : ClassDecl->bases()) {
+    const RecordType *BaseType = B.getType()->getAs<RecordType>();
----------------
For a non-abstract class, you should visit virtual bases as well as direct 
bases. (For an abstract class, you should skip direct and indirect virtual 
bases.)

================
Comment at: lib/Sema/SemaCUDA.cpp:128-132
@@ +127,7 @@
+        LookupSpecialMember(BaseClassDecl, CSM,
+                            /* ConstArg */ ConstRHS,
+                            /* VolatileArg */ false,
+                            /* RValueThis */ false,
+                            /* ConstThis */ false,
+                            /* VolatileThis */ false);
+
----------------
These are not necessarily correct; the user might have explicitly defaulted a 
const/volatile/whatever special member function.

================
Comment at: lib/Sema/SemaCUDA.cpp:146-148
@@ +145,5 @@
+      if (ResolutionError) {
+        Diag(ClassDecl->getLocation(),
+             diag::err_implicit_member_target_infer_collision)
+            << (unsigned)CSM << InferredTarget << BaseMethodTarget;
+        return;
----------------
Declaring implicit special members is done lazily, so emitting diagnostics from 
here will result in erratic behavior. It would be better to defer the 
diagnostic until the special member is defined in C++98, and to mark the member 
as deleted in this case in C++11.

================
Comment at: lib/Sema/SemaOverload.cpp:5637
@@ -5636,3 +5636,3 @@
     if (const FunctionDecl *Caller = dyn_cast<FunctionDecl>(CurContext))
-      if (CheckCUDATarget(Caller, Function)) {
+      if (!Caller->isImplicit() && CheckCUDATarget(Caller, Function)) {
         Candidate.Viable = false;
----------------
Hmm, why do you need this change?

http://reviews.llvm.org/D5199



_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits

Reply via email to