Skip to content

Conversation

@AlekseyTs
Copy link
Contributor

Fixes #80987

@AlekseyTs AlekseyTs requested a review from a team as a code owner November 3, 2025 22:18
while ((object)current != null);

diagnostics.Add(useSiteInfo.Diagnostics.IsNullOrEmpty() ? Location.None : (FindBaseRefSyntax(declaredBase) ?? GetFirstLocation()), useSiteInfo);
diagnostics.Add(useSiteInfo.Diagnostics.IsNullOrEmpty() ? Location.None : ((reportAtFirstLocation ? null : FindBaseRefSyntax(declaredBase)) ?? GetFirstLocation()), useSiteInfo);
Copy link
Member

@jjonescz jjonescz Nov 4, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

How exactly did FindBaseRefSyntax cause a cycle? If it cannot handle special types for some reason, shouldn't that be fixed instead to avoid similar issues in the future? #Resolved

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

How exactly did FindBaseRefSyntax cause a cycle? If it cannot handle special types for some reason, shouldn't that be fixed instead to avoid similar issues in the future?

Enum is the only declaration that syntactically has a base list that never contributes to the declared base value. FindBaseRefSyntax looks for a type reference in a base list. It attempts to bind types in the list, lookup needs to know base type, and for an enum, we end up here again, due to the same reason - base type is not in the base list, when we are binding types in it, we are not resolving bases. For scenarios when declaredBase isn't a result of binding of a name from base list, it doesn't make sense trying to find the type in that list.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I wonder whether we should just have FindBaseRefSyntax bail early for structs and enums instead. That would also have the benefit of preventing such a cycle from sneaking back in in the future if we need to get the base syntax in a new location.

Copy link
Contributor Author

@AlekseyTs AlekseyTs Nov 4, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I wonder whether we should just have FindBaseRefSyntax bail early for structs and enums instead. That would also have the benefit of preventing such a cycle from sneaking back in in the future if we need to get the base syntax in a new location.

I don't think this is the right thing to do. The purpose of FindBaseRefSyntax is to find type reference in the base list. There is nothing wrong in using it for enum type in general. It is not appropriate for the method to decide whether it is Ok to look into the list. This specific use of the method is troublesome, especially because, in this particular case, we are looking for something that we know isn't there.

@AlekseyTs AlekseyTs requested a review from jjonescz November 4, 2025 13:37
@AlekseyTs AlekseyTs requested a review from a team November 4, 2025 16:27
@AlekseyTs
Copy link
Contributor Author

@dotnet/roslyn-compiler For a second review

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Stackoverflow in BindNonGenericSimpleNamespaceOrTypeOrAliasSymbol in C# extension

3 participants