Skip to content

Commit 0b1ce70

Browse files
coadometa-codesync[bot]
authored andcommitted
Prevent identifiers being qualified to themselves (#56091)
Summary: Pull Request resolved: #56091 Changelog: [Internal] When qualifying a member, prevent taking itself as a target for qualification, to prevent types referencing themselves. Reviewed By: cipolleschi Differential Revision: D96455842 fbshipit-source-id: 2ed59a4688d0daa98db603a734283f41ffbe4ead
1 parent 91c6c4d commit 0b1ce70

File tree

3 files changed

+34
-1
lines changed

3 files changed

+34
-1
lines changed

scripts/cxx-api/parser/scope/scope.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ def __init__(self, kind: ScopeKindT, name: str | None = None) -> None:
2626
self.location: str | None = None
2727
self._members: list[Member] = []
2828
self._private_typedefs: dict[str, TypedefMember] = {}
29+
self._qualifying_member: Member | None = None
2930

3031
def get_qualified_name(self) -> str:
3132
"""
@@ -85,6 +86,8 @@ def qualify_name(self, name: str | None) -> str | None:
8586

8687
# Check if it's a member (type alias, variable, etc.)
8788
for m in current_scope._members:
89+
if m is current_scope._qualifying_member:
90+
continue
8891
if m.name == base_first and not isinstance(m, FriendMember):
8992
prefix = current_scope.get_qualified_name()
9093
return f"{prefix}::{name}" if prefix else name
@@ -110,7 +113,9 @@ def qualify_name(self, name: str | None) -> str | None:
110113
matched_segments.append(path_segment)
111114
current_scope = current_scope.inner_scopes[base_name]
112115
elif any(
113-
m.name == base_name and not isinstance(m, FriendMember)
116+
m.name == base_name
117+
and not isinstance(m, FriendMember)
118+
and m is not current_scope._qualifying_member
114119
for m in current_scope._members
115120
) or any(
116121
any(m.name == base_name for m in inner._members)
@@ -194,7 +199,9 @@ def close(self) -> None:
194199
typedef.close(self)
195200

196201
for member in self.get_members():
202+
self._qualifying_member = member
197203
member.close(self)
204+
self._qualifying_member = None
198205

199206
self.kind.close(self)
200207

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
struct test::Container {
2+
public using Wrapper = test::Wrapper<int>;
3+
}
4+
5+
template <typename T>
6+
struct test::Wrapper {
7+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
/*
2+
* Copyright (c) Meta Platforms, Inc. and affiliates.
3+
*
4+
* This source code is licensed under the MIT license found in the
5+
* LICENSE file in the root directory of this source tree.
6+
*/
7+
8+
#pragma once
9+
10+
namespace test {
11+
12+
template <typename T>
13+
struct Wrapper {};
14+
15+
struct Container {
16+
using Wrapper = Wrapper<int>;
17+
};
18+
19+
} // namespace test

0 commit comments

Comments
 (0)