-
Notifications
You must be signed in to change notification settings - Fork 4.2k
Avoid an infinite cycle in MakeAcyclicBaseType
#81005
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
| 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); |
There was a problem hiding this comment.
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
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
How exactly did
FindBaseRefSyntaxcause 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.
There was a problem hiding this comment.
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.
There was a problem hiding this comment.
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
FindBaseRefSyntaxbail early forstructs andenums 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.
|
@dotnet/roslyn-compiler For a second review |
Fixes #80987