================
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;
----------------
rsmith wrote:
> 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.
If I just mark the member as deleted in C++11, is there away to still emit the 
descriptive diagnostic? Just deleting the member doesn't provide the user with 
any hint of what the underlying problem is.

================
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;
----------------
rsmith wrote:
> Hmm, why do you need this change?
Consider what happens when the target inference method runs. It looks up the 
ctors of base classes, which gets to this point. Now, at this point we don't 
yet know what the caller's (the implicit method being defined) target is, so we 
can not reason whether there's a target mismatch. 

AFAIU this added test solves the problem, since we really cannot reject 
candidates based on target-ness when declaring an implicit member. The implicit 
member's target-ness will be determined by the inference method, and the 
collision test (the one with the Diag you commented on) should take care of 
mismatches.

Does this make sense?

http://reviews.llvm.org/D5199



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

Reply via email to