https://github.com/hokein updated https://github.com/llvm/llvm-project/pull/75779
>From 163a43a3c62964a6010dd57aa2670e7629c0a847 Mon Sep 17 00:00:00 2001 From: Haojian Wu <hokein...@gmail.com> Date: Mon, 18 Dec 2023 10:41:45 +0100 Subject: [PATCH 1/2] [clang] Fix CTAD not work for C++ explicit type conversion (functional annotation). Fixes https://github.com/llvm/llvm-project/issues/64347 --- clang/docs/ReleaseNotes.rst | 3 +++ clang/lib/Sema/SemaDecl.cpp | 2 +- clang/lib/Sema/SemaInit.cpp | 11 +++++++---- clang/test/SemaCXX/ctad.cpp | 19 +++++++++++++++++++ 4 files changed, 30 insertions(+), 5 deletions(-) create mode 100644 clang/test/SemaCXX/ctad.cpp diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst index edb97347f07716..39b9176865fc04 100644 --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -686,6 +686,9 @@ Bug Fixes in This Version - Fix an issue where clang doesn't respect detault template arguments that are added in a later redeclaration for CTAD. Fixes (#69987 <https://github.com/llvm/llvm-project/issues/69987>`_) +- Fix an issue where CTAD fails for explicit type conversion. + Fixes (#64347 <https://github.com/llvm/llvm-project/issues/64347>`_) + Bug Fixes to Compiler Builtins ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp index edf44bbc52119b..e08fed49f9ec0a 100644 --- a/clang/lib/Sema/SemaDecl.cpp +++ b/clang/lib/Sema/SemaDecl.cpp @@ -12957,7 +12957,7 @@ QualType Sema::deduceVarTypeFromInitializer(VarDecl *VDecl, // FIXME: Initialization should not be taking a mutable list of inits. SmallVector<Expr*, 8> InitsCopy(DeduceInits.begin(), DeduceInits.end()); return DeduceTemplateSpecializationFromInitializer(TSI, Entity, Kind, - InitsCopy, PL); + InitsCopy); } if (DirectInit) { diff --git a/clang/lib/Sema/SemaInit.cpp b/clang/lib/Sema/SemaInit.cpp index d6459fd9d7875d..a7b52c3d94b2ff 100644 --- a/clang/lib/Sema/SemaInit.cpp +++ b/clang/lib/Sema/SemaInit.cpp @@ -10561,7 +10561,7 @@ static bool isOrIsDerivedFromSpecializationOf(CXXRecordDecl *RD, QualType Sema::DeduceTemplateSpecializationFromInitializer( TypeSourceInfo *TSInfo, const InitializedEntity &Entity, - const InitializationKind &Kind, MultiExprArg Inits, ParenListExpr *PL) { + const InitializationKind &Kind, MultiExprArg Inits) { auto *DeducedTST = dyn_cast<DeducedTemplateSpecializationType>( TSInfo->getType()->getContainedDeducedType()); assert(DeducedTST && "not a deduced template specialization type"); @@ -10792,9 +10792,12 @@ QualType Sema::DeduceTemplateSpecializationFromInitializer( if (getLangOpts().CPlusPlus20 && !HasAnyDeductionGuide) { if (ListInit && ListInit->getNumInits()) { SynthesizeAggrGuide(ListInit); - } else if (PL && PL->getNumExprs()) { - InitListExpr TempListInit(getASTContext(), PL->getLParenLoc(), - PL->exprs(), PL->getRParenLoc()); + } else if (Inits.size()) { // parenthesized expression-list + // Inits are expressions inside the parentheses. We don't have + // the parentheses source locaitons, use the begin/end of Inits as the + // best heuristic. + InitListExpr TempListInit(getASTContext(), Inits.front()->getBeginLoc(), + Inits, Inits.back()->getEndLoc()); SynthesizeAggrGuide(&TempListInit); } } diff --git a/clang/test/SemaCXX/ctad.cpp b/clang/test/SemaCXX/ctad.cpp new file mode 100644 index 00000000000000..10806f107b4ee9 --- /dev/null +++ b/clang/test/SemaCXX/ctad.cpp @@ -0,0 +1,19 @@ +// RUN: %clang_cc1 -fsyntax-only -verify -Wno-unused-value -std=c++20 %s +// expected-no-diagnostics + +namespace GH64347 { + +template<typename X, typename Y> struct A { X x; Y y;}; +void test() { + A(1, 2); + new A(1, 2); +} + +template<A a> +void f() { (void)a; } +void k() { + // Test CTAD works for non-type template arguments. + f<A(0, 0)>(); +} + +} // namespace GH64347 >From 515accf296648ae57b2a1d876362e6f1033164c8 Mon Sep 17 00:00:00 2001 From: Haojian Wu <hokein...@gmail.com> Date: Tue, 19 Dec 2023 09:59:45 +0100 Subject: [PATCH 2/2] Fix a typo and update the Sema.h --- clang/include/clang/Sema/Sema.h | 3 +-- clang/lib/Sema/SemaInit.cpp | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/clang/include/clang/Sema/Sema.h b/clang/include/clang/Sema/Sema.h index 9887cc4ba4658d..5e3b57ea33220b 100644 --- a/clang/include/clang/Sema/Sema.h +++ b/clang/include/clang/Sema/Sema.h @@ -9354,8 +9354,7 @@ class Sema final { QualType DeduceTemplateSpecializationFromInitializer( TypeSourceInfo *TInfo, const InitializedEntity &Entity, - const InitializationKind &Kind, MultiExprArg Init, - ParenListExpr *PL = nullptr); + const InitializationKind &Kind, MultiExprArg Init); QualType deduceVarTypeFromInitializer(VarDecl *VDecl, DeclarationName Name, QualType Type, TypeSourceInfo *TSI, diff --git a/clang/lib/Sema/SemaInit.cpp b/clang/lib/Sema/SemaInit.cpp index a7b52c3d94b2ff..0fbd87ce34db90 100644 --- a/clang/lib/Sema/SemaInit.cpp +++ b/clang/lib/Sema/SemaInit.cpp @@ -10794,7 +10794,7 @@ QualType Sema::DeduceTemplateSpecializationFromInitializer( SynthesizeAggrGuide(ListInit); } else if (Inits.size()) { // parenthesized expression-list // Inits are expressions inside the parentheses. We don't have - // the parentheses source locaitons, use the begin/end of Inits as the + // the parentheses source locations, use the begin/end of Inits as the // best heuristic. InitListExpr TempListInit(getASTContext(), Inits.front()->getBeginLoc(), Inits, Inits.back()->getEndLoc()); _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits