[clang] 84bc0a9 - [Clang] Fix parsing of invalid type-requirement (#98545)
via cfe-commits
cfe-commits at lists.llvm.org
Fri Jul 12 04:12:17 PDT 2024
Author: cor3ntin
Date: 2024-07-12T13:12:14+02:00
New Revision: 84bc0a9e02bbcfc0f1e1333f642be37e687fb429
URL: https://github.com/llvm/llvm-project/commit/84bc0a9e02bbcfc0f1e1333f642be37e687fb429
DIFF: https://github.com/llvm/llvm-project/commit/84bc0a9e02bbcfc0f1e1333f642be37e687fb429.diff
LOG: [Clang] Fix parsing of invalid type-requirement (#98545)
A type-requirement cannot be an operator-function-id
Fixes #51868
Added:
Modified:
clang/docs/ReleaseNotes.rst
clang/lib/Sema/SemaTemplate.cpp
clang/test/Parser/cxx-concepts-requires-clause.cpp
Removed:
################################################################################
diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index 781fc8ab1de1e..2bca35cd4cf3c 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -1035,6 +1035,7 @@ Bug Fixes to C++ Support
- Fixed a CTAD substitution bug involving type aliases that reference outer template parameters. (#GH94614).
- Clang now correctly handles unexpanded packs in the template parameter list of a generic lambda expression
(#GH48937)
+- Fix a crash when parsing an invalid type-requirement in a requires expression. (#GH51868)
Bug Fixes to AST Handling
^^^^^^^^^^^^^^^^^^^^^^^^^
diff --git a/clang/lib/Sema/SemaTemplate.cpp b/clang/lib/Sema/SemaTemplate.cpp
index dfc861195d0a9..bb36736c021b3 100644
--- a/clang/lib/Sema/SemaTemplate.cpp
+++ b/clang/lib/Sema/SemaTemplate.cpp
@@ -11690,6 +11690,13 @@ Sema::ActOnTypenameType(Scope *S, SourceLocation TypenameLoc,
// Construct a dependent template specialization type.
assert(DTN && "dependent template has non-dependent name?");
assert(DTN->getQualifier() == SS.getScopeRep());
+
+ if (!DTN->isIdentifier()) {
+ Diag(TemplateIILoc, diag::err_template_id_not_a_type) << Template;
+ NoteAllFoundTemplates(Template);
+ return true;
+ }
+
QualType T = Context.getDependentTemplateSpecializationType(
ElaboratedTypeKeyword::Typename, DTN->getQualifier(),
DTN->getIdentifier(), TemplateArgs.arguments());
diff --git a/clang/test/Parser/cxx-concepts-requires-clause.cpp b/clang/test/Parser/cxx-concepts-requires-clause.cpp
index 5b5bc9ea978bf..13b4e8439882d 100644
--- a/clang/test/Parser/cxx-concepts-requires-clause.cpp
+++ b/clang/test/Parser/cxx-concepts-requires-clause.cpp
@@ -195,3 +195,12 @@ void F() {
int a = []<int=0> requires requires { [](auto){}; } { return 0; }();
} // namespace GH78524
+
+
+namespace GH51868 {
+template<auto L>
+concept C = requires {
+ typename decltype(L)::template operator()<int>;
+ // expected-error at -1 {{template name refers to non-type template 'decltype(L)::template operator ()'}}
+};
+}
More information about the cfe-commits
mailing list