[clang] [Clang] Fix handling of references to variable templates with an empty argument list (PR #191154)
Corentin Jabot via cfe-commits
cfe-commits at lists.llvm.org
Thu Apr 9 05:46:42 PDT 2026
https://github.com/cor3ntin updated https://github.com/llvm/llvm-project/pull/191154
>From e05e87da59ac0cce0d9590fc006f362ed3136f5b Mon Sep 17 00:00:00 2001
From: Corentin Jabot <corentinjabot at gmail.com>
Date: Thu, 9 Apr 2026 12:10:42 +0200
Subject: [PATCH 1/3] [Clang] Fix handling of references to variable templates
with an empty argument list
In some cases they were treated as having no argument list at all.
Fixes #191016.
---
clang/docs/ReleaseNotes.rst | 1 +
clang/include/clang/AST/ExprCXX.h | 8 +++++---
clang/test/SemaTemplate/concepts.cpp | 11 +++++++++++
3 files changed, 17 insertions(+), 3 deletions(-)
diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index 2da7175b51ea3..a72821bf970f1 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -426,6 +426,7 @@ Bug Fixes to C++ Support
template parameters when one of its parameters is also a pack. (#GH181166)
- Fixed a crash when a default argument is passed to an explicit object parameter. (#GH176639)
- Fixed an alias template CTAD crash.
+- Fix handling of ``Var<>`` when refering to a static member variable template. (#GH191016)
- Fixed a crash when diagnosing an invalid static member function with an explicit object parameter (#GH177741)
- Fixed a crash when instantiating an invalid out-of-line static data member definition in a local class. (#GH176152)
- Fixed a crash when pack expansions are used as arguments for non-pack parameters of built-in templates. (#GH180307)
diff --git a/clang/include/clang/AST/ExprCXX.h b/clang/include/clang/AST/ExprCXX.h
index c40cd929b7408..10c0f2ba6c44b 100644
--- a/clang/include/clang/AST/ExprCXX.h
+++ b/clang/include/clang/AST/ExprCXX.h
@@ -3281,12 +3281,14 @@ class OverloadExpr : public Expr {
bool hasExplicitTemplateArgs() const {
if (!hasTemplateKWAndArgsInfo())
return false;
+ if (getLAngleLoc().isValid())
+ return true;
// FIXME: deduced function types can have "hidden" args and no <
// investigate that further, but ultimately maybe we want to model concepts
// reference with another kind of expression.
- return (isConceptReference() || isVarDeclReference())
- ? getTrailingASTTemplateKWAndArgsInfo()->NumTemplateArgs
- : getLAngleLoc().isValid();
+ if (isConceptReference() || isVarDeclReference())
+ return getTrailingASTTemplateKWAndArgsInfo()->NumTemplateArgs;
+ return false;
}
bool isConceptReference() const {
diff --git a/clang/test/SemaTemplate/concepts.cpp b/clang/test/SemaTemplate/concepts.cpp
index 429df756c1c4f..ac80d16b4ccf8 100644
--- a/clang/test/SemaTemplate/concepts.cpp
+++ b/clang/test/SemaTemplate/concepts.cpp
@@ -1824,3 +1824,14 @@ namespace GH176402 {
recursiveLambda(recursiveLambda, 5);
}
}
+namespace GH191016 {
+ template <typename T = int>
+ struct S {
+ template <typename Args = int>
+ constexpr static bool P = true;
+ template <typename... Args>
+ constexpr static bool Q = true;
+ S() requires P<> && Q<> {}
+ };
+ void test(){ S<int> s; }
+}
>From a7df3c347d863e097713e1ac9d3b796381b4546b Mon Sep 17 00:00:00 2001
From: Corentin Jabot <corentinjabot at gmail.com>
Date: Thu, 9 Apr 2026 13:41:46 +0200
Subject: [PATCH 2/3] remove stale comment
---
clang/include/clang/AST/ExprCXX.h | 10 ++--------
1 file changed, 2 insertions(+), 8 deletions(-)
diff --git a/clang/include/clang/AST/ExprCXX.h b/clang/include/clang/AST/ExprCXX.h
index 10c0f2ba6c44b..948f18b31a5fc 100644
--- a/clang/include/clang/AST/ExprCXX.h
+++ b/clang/include/clang/AST/ExprCXX.h
@@ -3279,16 +3279,10 @@ class OverloadExpr : public Expr {
/// Determines whether this expression had explicit template arguments.
bool hasExplicitTemplateArgs() const {
- if (!hasTemplateKWAndArgsInfo())
- return false;
if (getLAngleLoc().isValid())
return true;
- // FIXME: deduced function types can have "hidden" args and no <
- // investigate that further, but ultimately maybe we want to model concepts
- // reference with another kind of expression.
- if (isConceptReference() || isVarDeclReference())
- return getTrailingASTTemplateKWAndArgsInfo()->NumTemplateArgs;
- return false;
+ return hasTemplateKWAndArgsInfo() &&
+ getTrailingASTTemplateKWAndArgsInfo()->NumTemplateArgs;
}
bool isConceptReference() const {
>From 8ccca6a87164b89ef7934ccb53b32a1bad5b6415 Mon Sep 17 00:00:00 2001
From: Corentin Jabot <corentinjabot at gmail.com>
Date: Thu, 9 Apr 2026 14:46:25 +0200
Subject: [PATCH 3/3] remove release note
---
clang/docs/ReleaseNotes.rst | 1 -
1 file changed, 1 deletion(-)
diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index a72821bf970f1..2da7175b51ea3 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -426,7 +426,6 @@ Bug Fixes to C++ Support
template parameters when one of its parameters is also a pack. (#GH181166)
- Fixed a crash when a default argument is passed to an explicit object parameter. (#GH176639)
- Fixed an alias template CTAD crash.
-- Fix handling of ``Var<>`` when refering to a static member variable template. (#GH191016)
- Fixed a crash when diagnosing an invalid static member function with an explicit object parameter (#GH177741)
- Fixed a crash when instantiating an invalid out-of-line static data member definition in a local class. (#GH176152)
- Fixed a crash when pack expansions are used as arguments for non-pack parameters of built-in templates. (#GH180307)
More information about the cfe-commits
mailing list