Skip to content

Commit e4a0719

Browse files
committed
feat: Improve parsing of template introduced name ids
Signed-off-by: Roberto Raggi <[email protected]>
1 parent edb1dc4 commit e4a0719

File tree

2 files changed

+78
-39
lines changed

2 files changed

+78
-39
lines changed

src/parser/cxx/parser.cc

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -996,7 +996,8 @@ auto Parser::parse_type_name(UnqualifiedIdAST*& yyast,
996996
auto lookat_simple_template_id = [&] {
997997
LookaheadParser lookahead{this};
998998
SimpleTemplateIdAST* templateId = nullptr;
999-
if (!parse_simple_template_id(templateId, nestedNameSpecifier))
999+
if (!parse_simple_template_id(templateId, nestedNameSpecifier,
1000+
isTemplateIntroduced))
10001001
return false;
10011002
yyast = templateId;
10021003
lookahead.commit();
@@ -2297,9 +2298,13 @@ auto Parser::parse_type_requirement(RequirementAST*& yyast) -> bool {
22972298

22982299
parse_optional_nested_name_specifier(ast->nestedNameSpecifier);
22992300

2301+
SourceLocation templateLoc;
2302+
const auto isTemplateIntroduced = match(TokenKind::T_TEMPLATE, templateLoc);
2303+
23002304
if (!parse_type_name(ast->unqualifiedId, ast->nestedNameSpecifier,
2301-
/*isTemplateIntroduced=*/false))
2305+
isTemplateIntroduced)) {
23022306
parse_error("expected a type name");
2307+
}
23032308

23042309
expect(TokenKind::T_SEMICOLON, ast->semicolonLoc);
23052310

@@ -10647,6 +10652,10 @@ auto Parser::parse_simple_template_id(
1064710652
Symbol* primaryTemplateSymbol = nullptr;
1064810653
Symbol* candidate = Lookup{scope_}(nestedNameSpecifier, identifier);
1064910654

10655+
if (symbol_cast<NonTypeParameterSymbol>(candidate)) {
10656+
return false;
10657+
}
10658+
1065010659
if (is_template(candidate))
1065110660
primaryTemplateSymbol = candidate;
1065210661
else if (auto overloads = symbol_cast<OverloadSetSymbol>(candidate)) {

tests/manual/source.cc

Lines changed: 67 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -5,71 +5,116 @@
55
#include <any>
66
#include <array>
77
#include <atomic>
8+
#ifdef __cpp_lib_barrier
9+
#include <barrier>
10+
#endif
811
#include <bit>
912
#include <bitset>
10-
#include <cassert>
11-
#include <ccomplex>
12-
#include <cctype>
13-
#include <cerrno>
14-
#include <cfenv>
15-
#include <cfloat>
1613
#include <charconv>
1714
#include <chrono>
18-
#include <cinttypes>
19-
#include <ciso646>
20-
#include <climits>
21-
#include <clocale>
22-
#include <cmath>
2315
#include <codecvt>
16+
#include <compare>
2417
#include <complex>
18+
#include <concepts>
2519
#include <condition_variable>
26-
#include <cstdarg>
27-
#include <cstdbool>
28-
#include <cstddef>
29-
#include <cstdint>
30-
#include <cstdio>
31-
#include <cstdlib>
32-
#include <cstring>
33-
#include <ctgmath>
34-
#include <ctime>
35-
#include <cwchar>
36-
#include <cwctype>
20+
#include <coroutine>
3721
#include <deque>
3822
#include <exception>
23+
#include <execution>
24+
#include <expected>
25+
26+
#ifdef __cpp_lib_filesystem
27+
#include <filesystem>
28+
#endif
29+
30+
#ifdef __cpp_lib_flat_map
31+
#include <flat_map>
32+
#endif
33+
34+
#ifdef __cpp_lib_flat_set
35+
#include <flat_set>
36+
#endif
37+
#include <format>
3938
#include <forward_list>
4039
#include <fstream>
4140
#include <functional>
41+
42+
#ifdef __cpp_lib_generator
43+
#include <generator>
44+
#endif
45+
4246
#include <initializer_list>
4347
#include <iomanip>
4448
#include <ios>
4549
#include <iosfwd>
4650
#include <iostream>
4751
#include <istream>
4852
#include <iterator>
53+
54+
#ifdef __cpp_lib_latch
55+
#include <latch>
56+
#endif
57+
4958
#include <limits>
5059
#include <list>
5160
#include <locale>
5261
#include <map>
62+
#include <mdspan>
5363
#include <memory>
64+
#include <memory_resource>
65+
66+
#ifdef __cpp_lib_scoped_lock
5467
#include <mutex>
68+
#endif
69+
5570
#include <new>
71+
#include <numbers>
5672
#include <numeric>
5773
#include <optional>
5874
#include <ostream>
75+
76+
#ifdef __cpp_lib_print
77+
#include <print>
78+
#endif
79+
5980
#include <queue>
6081
#include <random>
82+
#include <ranges>
6183
#include <ratio>
6284
#include <regex>
6385
#include <scoped_allocator>
6486
#include <set>
87+
#ifdef __cpp_lib_shared_mutex
88+
#include <shared_mutex>
89+
#endif
90+
#include <source_location>
6591
#include <span>
92+
#ifdef __cpp_lib_spanstream
93+
#include <spanstream>
94+
#endif
6695
#include <sstream>
6796
#include <stack>
97+
#ifdef __cpp_lib_stacktrace
98+
#include <stacktrace>
99+
#endif
68100
#include <stdexcept>
101+
#if false
102+
#include <stdfloat>
103+
#endif
104+
#ifdef __cpp_lib_jthread
105+
#include <stop_token>
106+
#endif
69107
#include <streambuf>
70108
#include <string>
71109
#include <string_view>
110+
#include <strstream>
111+
#include <syncstream>
72112
#include <system_error>
113+
#ifndef _LIBCPP_HAS_NO_THREADS
114+
#include <future>
115+
#include <semaphore>
116+
#include <thread>
117+
#endif
73118
#include <tuple>
74119
#include <type_traits>
75120
#include <typeindex>
@@ -80,18 +125,3 @@
80125
#include <valarray>
81126
#include <variant>
82127
#include <vector>
83-
84-
#ifndef _LIBCPP_HAS_NO_THREADS
85-
#include <future>
86-
#include <shared_mutex>
87-
#include <thread>
88-
#endif
89-
90-
#ifndef __wasi__
91-
#include <csetjmp>
92-
#include <csignal>
93-
#include <filesystem>
94-
#endif
95-
96-
// #include <execution>
97-
// #include <compare>

0 commit comments

Comments
 (0)