Anastasia added inline comments.

================
Comment at: clang/lib/Sema/SemaOverload.cpp:9870
 
+  if (S.getLangOpts().OpenCL) {
+    if (const auto *CD1 = 
dyn_cast_or_null<CXXConstructorDecl>(Cand1.Function)) {
----------------
olestrohm wrote:
> Anastasia wrote:
> > olestrohm wrote:
> > > Anastasia wrote:
> > > > olestrohm wrote:
> > > > > Anastasia wrote:
> > > > > > I think we should remove the OpenCL check since it is not OpenCL 
> > > > > > specific rule and you are using common helpers indeed!
> > > > > > 
> > > > > > I also wonder if this should be applied to all member functions not 
> > > > > > only ctors since `isBetterOverloadCandidate` should be used for 
> > > > > > everything?
> > > > > > 
> > > > > > However it seems that other members are already handled somehow 
> > > > > > https://godbolt.org/z/MrWKPKed7. Do you know where this handling 
> > > > > > comes from?
> > > > > It's handled in SemaOverload.cpp:10000 in 
> > > > > `OverloadCandidateSet::BestViableFunction` which checks if the given 
> > > > > function is viable or not. For member functions the address space 
> > > > > they're defined in and the address space of the variable have to 
> > > > > match. Therefore only one of them is valid at a time and they never 
> > > > > get checked against each other in `isBetterOverloadCandidate`.
> > > > I am quite sure that for the example above both `__private` and 
> > > > `__generic `overloads are viable. In fact, if you remove the 
> > > > `__private` overload the `__generic` one gets picked.
> > > > 
> > > > So I think the logic should be checking for compatibility rather than 
> > > > the exact match i.e. using `isAddressSpaceSupersetOf` although it might 
> > > > not be calling that helper directly but through the other Qualifier 
> > > > logic.
> > > Ah, I think I checked it wrong last time. Going through it again it's 
> > > actually determined by `QualType::isMoreQualifiedThan` in the end. I'll 
> > > look into it more.
> > So did you happen to find where the address space ranking for the members 
> > is currently happening for this test case https://godbolt.org/z/MrWKPKed7?
> > 
> > I just want to make sure we don't add any redundant checks... so if let's 
> > say we already have a similar logic elsewhere it would be better if we 
> > attempt to generalize it or move it entirely here if it's doable. In 
> > general, we should try to use general qualifier logic if it works instead 
> > of specializing for address spaces.
> It's handled on line 9661 with a call to CompareImplicitConversionSequences, 
> which then goes through a couple of checks and discovers that the return type 
> of one of the functions is more specialized than the other. However this uses 
> the Conversions part of the candidates, which the constructors don't have.
> 
> I did attempt to generalize this further than address spaces, but that caused 
> some tests to fail, so I think it makes sense to only check address spaces 
> here.
Ah I see. Is it because the object parameter is not added implicitly in the 
ctors?

If this is only working for ctors I wonder if we should cast to 
`CXXConstructorDecl` instead of `CXXMethodDecl` or/and also add a comment 
explaining that?


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D102850/new/

https://reviews.llvm.org/D102850

_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to