Skip to content

crash with StackOverflowError #1661

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

Closed
helloqirun opened this issue Nov 5, 2016 · 6 comments
Closed

crash with StackOverflowError #1661

helloqirun opened this issue Nov 5, 2016 · 6 comments

Comments

@helloqirun
Copy link

This case is a bit large. I tried to minimize it, without much luck.

$ cat abc.scala

sealed trait C
case object C65 extends C
case object C66 extends C
case object C67 extends C
case object C68 extends C
case object C69 extends C
case object C70 extends C
case object C71 extends C
case object C72 extends C
case object C73 extends C
case object C74 extends C
case object C75 extends C
case object C76 extends C
case object C77 extends C
case object C78 extends C
case object C79 extends C
case object C80 extends C
case object C81 extends C
case object C82 extends C
case object C83 extends C
case object C84 extends C
case object C85 extends C
case object C86 extends C
case object C87 extends C
case object C88 extends C
case object C89 extends C
case object C90 extends C
case object C91 extends C
case object C92 extends C
case object C93 extends C
case object C94 extends C
case object C95 extends C
case object C96 extends C
case object C97 extends C
case object C98 extends C
case object C99 extends C
case object C100 extends C
case object C101 extends C
case object C102 extends C
case object C103 extends C
case object C104 extends C
case object C105 extends C
case object C106 extends C
case object C107 extends C
case object C108 extends C
case object C109 extends C
case object C110 extends C
case object C111 extends C
case object C112 extends C
case object C113 extends C
case object C114 extends C
case object C115 extends C
case object C116 extends C
case object C117 extends C
case object C118 extends C
case object C119 extends C
case object C120 extends C
case object C121 extends C
case object C122 extends C
case object C123 extends C
case object C124 extends C
case object C125 extends C
case object C126 extends C
case object C127 extends C
case object C128 extends C
case object C129 extends C
case object C130 extends C
case object C131 extends C
case object C132 extends C
case object C133 extends C
case object C134 extends C
case object C135 extends C
case object C136 extends C
case object C137 extends C
case object C138 extends C
case object C139 extends C
case object C140 extends C
case object C141 extends C
case object C142 extends C
case object C143 extends C
case object C144 extends C
case object C145 extends C
case object C146 extends C
case object C147 extends C
case object C148 extends C
case object C149 extends C
case object C150 extends C
case object C151 extends C
case object C152 extends C
case object C153 extends C
case object C154 extends C
case object C155 extends C
case object C156 extends C
case object C157 extends C
case object C158 extends C
case object C159 extends C
case object C160 extends C
case object C161 extends C
case object C162 extends C
case object C163 extends C
case object C164 extends C
case object C165 extends C
case object C166 extends C
case object C167 extends C
case object C168 extends C
case object C169 extends C
case object C170 extends C
case object C171 extends C
case object C172 extends C
case object C173 extends C
case object C174 extends C
case object C175 extends C
case object C176 extends C
case object C177 extends C
case object C178 extends C
case object C179 extends C
case object C180 extends C
case object C181 extends C
case object C182 extends C
case object C183 extends C
case object C184 extends C
case object C185 extends C
case object C186 extends C
case object C187 extends C
case object C188 extends C
case object C189 extends C
case object C190 extends C
case object C191 extends C
case object C192 extends C
case object C193 extends C
case object C194 extends C
case object C195 extends C
case object C196 extends C
case object C197 extends C
case object C198 extends C
case object C199 extends C
case object C231 extends C
case object C232 extends C
case object C233 extends C
case object C234 extends C
case object C235 extends C
case object C236 extends C
case object C237 extends C
case object C238 extends C
case object C239 extends C
case object C240 extends C
case object C241 extends C
case object C242 extends C
case object C243 extends C
case object C244 extends C
case object C245 extends C
case object C246 extends C
case object C247 extends C
case object C248 extends C
case object C249 extends C
case object C250 extends C
case object C251 extends C
case object C252 extends C
case object C253 extends C
case object C254 extends C
case object C255 extends C
case object C256 extends C
case object C257 extends C
case object C258 extends C
case object C259 extends C
case object C260 extends C
case object C261 extends C
case object C262 extends C
case object C263 extends C
case object C264 extends C
case object C265 extends C
case object C266 extends C
case object C267 extends C
case object C268 extends C
case object C269 extends C
case object C270 extends C
case object C271 extends C
case object C272 extends C
case object C273 extends C
case object C274 extends C
case object C275 extends C
case object C276 extends C
case object C277 extends C
case object C278 extends C
case object C279 extends C
case object C280 extends C
case object C281 extends C
case object C282 extends C
case object C283 extends C
case object C284 extends C
case object C285 extends C
case object C286 extends C
case object C287 extends C
case object C288 extends C
case object C289 extends C
case object C290 extends C
case object C291 extends C
case object C292 extends C
case object C293 extends C
case object C294 extends C
case object C295 extends C
case object C296 extends C
case object C297 extends C
case object C298 extends C
case object C299 extends C
object M {
  def f(c: C): Int = c match {
    case C65 => 65
    case C66 => 66
    case C67 => 67
    case C68 => 68
    case C69 => 69
    case C132 => 133
    case C71 => 71
    case C72 => 72
    case C73 => 73
    case C74 => 74
    case C75 => 75
    case C76 => 76
    case C77 => 77
    case C78 => 78
    case C79 => 79
    case C80 => 80
    case C81 => 81
    case C82 => 82
    case C83 => 83
    case C84 => 84
    case C85 => 85
    case C86 => 86
    case C87 => 87
    case C88 => 88
    case C89 => 89
    case C90 => 90
    case C91 => 91
    case C92 => 92
    case C93 => 93
    case C94 => 94
    case C95 => 95
    case C96 => 96
    case C97 => 97
    case C98 => 98
    case C99 => 99
    case C100 => 100
    case C101 => 101
    case C102 => 102
    case C103 => 103
    case C104 => 104
    case C105 => 105
    case C106 => 106
    case C107 => 107
    case C108 => 108
    case C109 => 109
    case C110 => 110
    case C111 => 111
    case C112 => 112
    case C113 => 113
    case C114 => 114
    case C115 => 115
    case C116 => 116
    case C117 => 117
    case C118 => 118
    case C119 => 119
    case C120 => 120
    case C121 => 121
    case C122 => 122
    case C123 => 123
    case C124 => 124
    case C125 => 125
    case C126 => 126
    case C127 => 127
    case C128 => 128
    case C129 => 129
    case C130 => 130
    case C131 => 131
    case C132 => 132
    case C133 => 133
    case C134 => 134
    case C135 => 135
    case C136 => 136
    case C137 => 137
    case C138 => 138
    case C139 => 139
    case C140 => 140
    case C141 => 141
    case C142 => 142
    case C143 => 143
    case C144 => 144
    case C145 => 145
    case C146 => 146
    case C147 => 147
    case C148 => 148
    case C149 => 149
    case C150 => 150
    case C151 => 151
    case C152 => 152
    case C153 => 153
    case C154 => 154
    case C155 => 155
    case C156 => 156
    case C157 => 157
    case C158 => 158
    case C159 => 159
    case C160 => 160
    case C161 => 161
    case C162 => 162
    case C163 => 163
    case C164 => 164
    case C165 => 165
    case C166 => 166
    case C167 => 167
    case C168 => 168
    case C169 => 169
    case C170 => 170
    case C171 => 171
    case C172 => 172
    case C173 => 173
    case C174 => 174
    case C175 => 175
    case C176 => 176
    case C177 => 177
    case C178 => 178
    case C179 => 179
    case C180 => 180
    case C181 => 181
    case C182 => 182
    case C183 => 183
    case C184 => 184
    case C185 => 185
    case C186 => 186
    case C187 => 187
    case C188 => 188
    case C189 => 189
    case C190 => 190
    case C191 => 191
    case C192 => 192
    case C193 => 193
    case C194 => 194
    case C195 => 195
    case C196 => 196
    case C197 => 197
    case C198 => 198
    case C199 => 199
    case C231 => 231
    case C232 => 232
    case C233 => 233
    case C234 => 234
    case C235 => 235
    case C236 => 236
    case C237 => 237
    case C238 => 238
    case C239 => 239
    case C240 => 240
    case C241 => 241
    case C242 => 242
    case C243 => 243
    case C244 => 244
    case C245 => 245
    case C246 => 246
    case C247 => 247
    case C248 => 248
    case C249 => 249
    case C250 => 250
    case C251 => 251
    case C252 => 252
    case C253 => 253
    case C254 => 254
    case C255 => 255
    case C256 => 256
    case C257 => 257
    case C258 => 258
    case C259 => 259
    case C260 => 260
    case C261 => 261
    case C262 => 262
    case C263 => 263
    case C264 => 264
    case C265 => 265
    case C266 => 266
    case C267 => 267
    case C268 => 268
    case C269 => 269
    case C270 => 270
    case C271 => 271
    case C272 => 272
    case C273 => 273
    case C274 => 274
    case C275 => 275
    case C276 => 276
    case C277 => 277
    case C278 => 278
    case C279 => 279
    case C280 => 280
    case C281 => 281
    case C282 => 282
    case C283 => 283
    case C284 => 284
    case C285 => 285
    case C286 => 286
    case C287 => 287
    case C288 => 288
    case C289 => 289
    case C290 => 290
    case C291 => 291
    case C292 => 292
    case C293 => 293
    case C294 => 294
    case C295 => 295
    case C296 => 296
    case C297 => 297
    case C298 => 298
    case C299 => 299
  }
}

$ dotc abc.scala

-- Warning: abc.scala --------------------------------------------------------------------------------------------------
207 |  def f(c: C): Int = c match {
    |                     ^
    |                     match may not be exhaustive.
    |                     It would fail on the following input: C70
208 |    case C65 => 65
209 |    case C66 => 66
210 |    case C67 => 67
211 |    case C68 => 68
212 |    case C69 => 69
<snipped>
Exception in thread "main" java.lang.StackOverflowError
        at dotty.tools.dotc.core.TypeErasure.eraseResult(TypeErasure.scala:442)
        at dotty.tools.dotc.core.TypeErasure.dotty$tools$dotc$core$TypeErasure$$apply(TypeErasure.scala:367)
        at dotty.tools.dotc.core.TypeErasure.eraseInfo(TypeErasure.scala:424)
        at dotty.tools.dotc.core.TypeErasure$.transformInfo(TypeErasure.scala:178)
        at dotty.tools.dotc.transform.Erasure.transform(Erasure.scala:60)
        at dotty.tools.dotc.core.Denotations$SingleDenotation.current(Denotations.scala:797)
        at dotty.tools.dotc.core.Types$NamedType.computeDenot(Types.scala:1434)
<snipped>
@liufengyun
Copy link
Contributor

Thanks for reporting @helloqirun . We touched this issue before (#1257), compile with the option -J-Xss5M will be fine:

dotc -J-Xss5M tests/patmat/patmatexhaust-huge.scala

We'll look if we can improve the code to avoid stackoverflow in this simple case.

@odersky
Copy link
Contributor

odersky commented Nov 6, 2016

Yes, we know that some code can blow the stack size, typically in Erasure.

Two things:

  1. This could point to an inefficient translation of this pattern match. We should see whether the planned optimizations will help here.
  2. A systematic fix should probably involve the runner script, which should augment the stacksize from the default.

@DarkDimius
Copy link
Contributor

I'd say that a systematic fix would be to make erasure use less stack. For example by making it be less-of-a typer, hopefully more of a mini-phase.

@DemiMarie
Copy link

@allanrenucci
Copy link
Contributor

Fixed on master.
@nicolasstucki This looks like a duplicate of #2903. Should we add a new test case?

@nicolasstucki
Copy link
Contributor

Yes, we should add the test case as a regression test. It is related to #2903, but without the added complexity of extracting parameters.

nicolasstucki added a commit that referenced this issue Jan 5, 2018
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

7 participants