Author: Haojian Wu Date: 2024-05-16T20:57:58+02:00 New Revision: a383b3cca3383128123b33bc73ffc0199ec573e4
URL: https://github.com/llvm/llvm-project/commit/a383b3cca3383128123b33bc73ffc0199ec573e4 DIFF: https://github.com/llvm/llvm-project/commit/a383b3cca3383128123b33bc73ffc0199ec573e4.diff LOG: [clang] CTAD alias: Emit a more descriptive diagnostic message when is_deducible constraint is evaluated to false. (#92389) Fixes https://github.com/llvm/llvm-project/issues/92225 Added: Modified: clang/include/clang/Basic/DiagnosticSemaKinds.td clang/lib/Sema/SemaConcept.cpp clang/test/SemaCXX/cxx20-ctad-type-alias.cpp Removed: ################################################################################ diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td b/clang/include/clang/Basic/DiagnosticSemaKinds.td index 3be9d34b36b06..7e487b70b03dc 100644 --- a/clang/include/clang/Basic/DiagnosticSemaKinds.td +++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td @@ -3003,6 +3003,8 @@ def note_single_arg_concept_specialization_constraint_evaluated_to_false : Note< "%select{and|because}0 %1 does not satisfy %2">; def note_atomic_constraint_evaluated_to_false_elaborated : Note< "%select{and|because}0 '%1' (%2 %3 %4) evaluated to false">; +def note_is_deducible_constraint_evaluated_to_false : Note< + "cannot deduce template arguments for %0 from %1">; def err_constrained_virtual_method : Error< "virtual function cannot have a requires clause">; def err_trailing_requires_clause_on_deduction_guide : Error< diff --git a/clang/lib/Sema/SemaConcept.cpp b/clang/lib/Sema/SemaConcept.cpp index 7bfec4e11f7aa..202dd86c67f62 100644 --- a/clang/lib/Sema/SemaConcept.cpp +++ b/clang/lib/Sema/SemaConcept.cpp @@ -1162,6 +1162,13 @@ static void diagnoseWellFormedUnsatisfiedConstraintExpr(Sema &S, break; } return; + } else if (auto *TTE = dyn_cast<TypeTraitExpr>(SubstExpr); + TTE && TTE->getTrait() == clang::TypeTrait::BTT_IsDeducible) { + assert(TTE->getNumArgs() == 2); + S.Diag(SubstExpr->getSourceRange().getBegin(), + diag::note_is_deducible_constraint_evaluated_to_false) + << TTE->getArg(0)->getType() << TTE->getArg(1)->getType(); + return; } S.Diag(SubstExpr->getSourceRange().getBegin(), diff --git a/clang/test/SemaCXX/cxx20-ctad-type-alias.cpp b/clang/test/SemaCXX/cxx20-ctad-type-alias.cpp index 7c186dc379c7b..21b2b8bff5002 100644 --- a/clang/test/SemaCXX/cxx20-ctad-type-alias.cpp +++ b/clang/test/SemaCXX/cxx20-ctad-type-alias.cpp @@ -111,7 +111,7 @@ struct Foo { template <typename X, int Y> using Bar = Foo<X, sizeof(X)>; // expected-note {{candidate template ignored: couldn't infer template argument 'X'}} \ // expected-note {{candidate template ignored: constraints not satisfied [with X = int]}} \ - // expected-note {{because '__is_deducible}} + // expected-note {{cannot deduce template arguments for 'Bar' from 'Foo<int, 4UL>'}} Bar s = {{1}}; // expected-error {{no viable constructor or deduction guide }} @@ -138,7 +138,7 @@ template<class T> struct Foo { T c; }; template<class X, class Y=A> using AFoo = Foo<Y>; // expected-note {{candidate template ignored: could not match 'Foo<type-parameter-0-0>' against 'int'}} \ // expected-note {{candidate template ignored: constraints not satisfied [with Y = int]}} \ - // expected-note {{because '__is_deducible(AFoo, Foo<int>)' evaluated to false}} \ + // expected-note {{cannot deduce template arguments for 'AFoo' from 'Foo<int>'}} \ // expected-note {{candidate function template not viable: requires 0 arguments, but 1 was provided}} AFoo s = {1}; // expected-error {{no viable constructor or deduction guide for deduction of template arguments of 'AFoo'}} @@ -196,10 +196,9 @@ template <class T> struct Foo { Foo(T); }; template<class V> using AFoo = Foo<V *>; template<typename> concept False = false; -// FIXME: emit a more descriptive diagnostic for "__is_deducible" constraint failure. template<False W> using BFoo = AFoo<W>; // expected-note {{candidate template ignored: constraints not satisfied [with V = int]}} \ - // expected-note {{because '__is_deducible(BFoo, Foo<int *>)' evaluated to false}} \ + // expected-note {{cannot deduce template arguments for 'BFoo' from 'Foo<int *>'}} \ // expected-note {{candidate template ignored: could not match 'Foo<type-parameter-0-0 *>' against 'int *'}} int i = 0; AFoo a1(&i); // OK, deduce Foo<int *> _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits