ilya-biryukov accepted this revision. ilya-biryukov added inline comments. This revision is now accepted and ready to land.
================ Comment at: clang/test/SemaTemplate/concepts-using-decl.cpp:174 +} // namespace heads_without_concepts. \ No newline at end of file ---------------- NIT: add newline? ================ Comment at: clang/test/SemaTemplate/concepts-using-decl.cpp:112 + expect<1>(baz{}.foo<Empty>()); // expected-error {{call to member function 'foo' is ambiguous}} +} +} ---------------- usaxena95 wrote: > ilya-biryukov wrote: > > Could you also check that `requires` clauses and constraints in template > > parameters do not hide each other? > > ``` > > template <IsEmpty T> ... > > // vs > > template <class T> requires IsEmpty<T> ... > > // vs > > template <class T> void foo() requires IsEmpty<T> ... > > ``` > > Should not hide each other. > > > > Another interesting case (that probably does not yet work): > > ``` > > struct base { template <class T> void foo(); }; > > struct derived : base { > > using base::foo; > > template <IsEmpty T> void foo(); > > }; > > ``` > > ^^ `derived().foo<Empty>()` will probably produce an ambiguity now (as we > > don't have an explicit requires clause here). I don't think it's worth > > fixing now, but keeping a test for it with a FIXME seems reasonable. > The last test case would work though since we perform template head check if > any template head is contrained. This is not ambiguous as overloading chooses > the "most contrained" version. Ah, right, this case is not ambiguous to start with. I think I made a mistake in the description. The call with `Empty` would work either way and does not check anything: - we only see a constrained overload => it works, - we see both overloads, but the one with `IsEmpty` is more specialized => it works. I suggest also checking that `derived().foo<int>()` works. In that case the outcomes are different: - we only see a constrained overload => compiler error, - we see both overloads => constrained version does not match and the overload succeeds. PS I was definitely under the impression that we are checking for the requires clause, but not constrained template parameters. However, I now see that I was wrong and we should also be fine with that case. Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D136440/new/ https://reviews.llvm.org/D136440 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits