Skip to content

[Sema] NFC: fix assert-only crasher with overloaded generics #22689

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

Merged

Conversation

davezarzycki
Copy link
Contributor

No description provided.

@davezarzycki davezarzycki requested a review from xedin February 18, 2019 13:53
@davezarzycki
Copy link
Contributor Author

@swift-ci please smoke test and merge

@davezarzycki
Copy link
Contributor Author

@swift-ci please smoke test linux

struct G<T:B> { var v : T }

let a = G(v: X())
let b = G(v: Y())
Copy link
Contributor

Choose a reason for hiding this comment

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

Updated assert makes sense, thank you! But the example itself doesn't trigger updated code in requirement failure, or any diagnostics for that matter. Would be great to get this example to diagnose before merging. I think that might be a bit tough though because fixing requirements in overloaded decls like that usually leads to ambiguities because both Gs would much.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Hi @xedin – If you look at the test case, it negates the exit value via not because the actual diagnostics doesn't matter, just that the test case should no longer crash the compiler.

Copy link
Contributor

Choose a reason for hiding this comment

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

Sorry what I mean is example as-is type-checks correctly, it's not going to generate any fixes, and subsequently not going to trigger getDeclRef() code and crash.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

The test case does not type check as is. Before this pull request:

/tmp/gt.swift:8:8: error: invalid redeclaration of 'G'
struct G<T:B> { var v : T }
       ^
/tmp/gt.swift:7:8: note: 'G' previously declared here
struct G<T:A> { var v : T }
       ^
/tmp/gt.swift:11:9: error: generic struct 'G' requires that 'Y' conform to 'A'
let b = G(v: Y())
        ^
/tmp/gt.swift:7:8: note: where 'T' = 'Y'
struct G<T:A> { var v : T }
       ^
swift: /home/dave/s/u/swift/lib/Sema/CSDiagnostics.cpp:149: swift::ValueDecl *swift::constraints::RequirementFailure::getDeclRef() const: Assertion `isa<TypeExpr>(AE->getFn())' failed.

Copy link
Contributor

Choose a reason for hiding this comment

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

Ah, sorry for the confusion, I've tried in REPL and it works differently there, would create two decls in different modules, that's why it type-checked just fine...

@davezarzycki
Copy link
Contributor Author

@swift-ci please smoke test linux

@davezarzycki davezarzycki merged commit 65a452f into swiftlang:master Feb 19, 2019
@davezarzycki davezarzycki deleted the fix_overloaded_generics_crash branch February 19, 2019 13:21
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants