llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT--> @llvm/pr-subscribers-clang Author: Oleksandr T. (a-tarasyuk) <details> <summary>Changes</summary> Fixes #<!-- -->46386 --- When an abbreviated function template appears in an `extern "C"` block and all template parameters are invented, `TemplateParams->getTemplateLoc()` becomes invalid, leading to an incorrect error location. These changes ensure that the error points to the parameter's location when the template location is invalid. --- Full diff: https://github.com/llvm/llvm-project/pull/129139.diff 3 Files Affected: - (modified) clang/docs/ReleaseNotes.rst (+1) - (modified) clang/lib/Sema/SemaTemplate.cpp (+6-2) - (modified) clang/test/CXX/temp/temp.pre/p6.cpp (+15) ``````````diff diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst index 2b72143482943..902de9f5f012c 100644 --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -249,6 +249,7 @@ Bug Fixes to C++ Support - The initialization kind of elements of structured bindings direct-list-initialized from an array is corrected to direct-initialization. - Clang no longer crashes when a coroutine is declared ``[[noreturn]]``. (#GH127327) +- Clang now uses the parameter location for abbreviated function templates in ``extern "C"``. (#GH46386) Bug Fixes to AST Handling ^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/clang/lib/Sema/SemaTemplate.cpp b/clang/lib/Sema/SemaTemplate.cpp index 38fa3ff3ab5b4..3d26428e0a31e 100644 --- a/clang/lib/Sema/SemaTemplate.cpp +++ b/clang/lib/Sema/SemaTemplate.cpp @@ -7991,8 +7991,12 @@ Sema::CheckTemplateDeclScope(Scope *S, TemplateParameterList *TemplateParams) { // have C linkage. DeclContext *Ctx = S->getEntity(); if (Ctx && Ctx->isExternCContext()) { - Diag(TemplateParams->getTemplateLoc(), diag::err_template_linkage) - << TemplateParams->getSourceRange(); + SourceRange Range = + TemplateParams->getTemplateLoc().isInvalid() && TemplateParams->size() + ? TemplateParams->getParam(TemplateParams->size() - 1) + ->getSourceRange() + : TemplateParams->getSourceRange(); + Diag(Range.getBegin(), diag::err_template_linkage) << Range; if (const LinkageSpecDecl *LSD = Ctx->getExternCContext()) Diag(LSD->getExternLoc(), diag::note_extern_c_begins_here); return true; diff --git a/clang/test/CXX/temp/temp.pre/p6.cpp b/clang/test/CXX/temp/temp.pre/p6.cpp index cb8c70ca3abed..264972eb44eb3 100644 --- a/clang/test/CXX/temp/temp.pre/p6.cpp +++ b/clang/test/CXX/temp/temp.pre/p6.cpp @@ -1,4 +1,19 @@ // RUN: %clang_cc1 -std=c++20 -verify %s +// RUN: not %clang_cc1 -std=c++20 -fsyntax-only -fno-diagnostics-show-line-numbers -fcaret-diagnostics-max-lines=1 %s 2>&1 | FileCheck %s -strict-whitespace + +namespace GH46386 { + extern "C" { // expected-note {{extern "C" language linkage specification begins here}} + + // CHECK: error: templates must have C++ linkage + // CHECK-NEXT: {{^}} void f(auto) {} + // CHECK-NEXT: {{^}} ^~~~~{{$}} + void f(auto) {} // expected-error {{templates must have C++ linkage}} + + void f(void) { // expected-note {{candidate function not viable: requires 0 arguments, but 1 was provided}} + f(1); // expected-error {{no matching function for call to 'f'}} + } +} +} // Templates and partial and explicit specializations can't have C linkage. namespace extern_c_templates { `````````` </details> https://github.com/llvm/llvm-project/pull/129139 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits