yaxunl added a comment. In D79526#2042680 <https://reviews.llvm.org/D79526#2042680>, @tra wrote:
> Reduced test case: > > struct a { > __attribute__((device)) a(short); > __attribute__((device)) operator unsigned() const; > __attribute__((device)) operator int() const; > }; > struct b { > a d; > }; > void f(b g) { b e = g; } > > > Failure: > > $ bin/clang++ -x cuda aten.cc -fsyntax-only > --cuda-path=$HOME/local/cuda-10.1 --cuda-device-only --cuda-gpu-arch=sm_60 > -stdlib=libc++ -std=c++17 -ferror-limit=1 > > aten.cc:6:8: error: conversion from 'const a' to 'short' is ambiguous > struct b { > ^ > aten.cc:9:21: note: in implicit copy constructor for 'b' first required here > void f(b g) { b e = g; } > ^ > aten.cc:3:27: note: candidate function > __attribute__((device)) operator unsigned() const; > ^ > aten.cc:4:27: note: candidate function > __attribute__((device)) operator int() const; > ^ > aten.cc:2:34: note: passing argument to parameter here > __attribute__((device)) a(short); > ^ > 1 error generated when compiling for sm_60. > > > The same code compiles fine in C++ and I would expect it to work on device > side the same way. a and b both have an implicit HD copy ctor. In device compilation, copy ctor of b is calling copy ctor of a. There are two candidates: implicit HD copy ctor of a, and device ctor a(short). In my previous fix, I made H and implicit HD candidate equal, however I forgot about the relation between D candidate and HD candidate. I incorrectly made D favored over HD and H. This caused inferior device candidate a(short) chosen over copy ctor of a. I have a fix for this https://reviews.llvm.org/D80450 Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D79526/new/ https://reviews.llvm.org/D79526 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits