You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Allow interop with classes with virtual base classes. (#6413)
For now, treat such classes as being final, since we can't correctly
derive from them.
This removes the last category of C++ class that we are entirely unable
to interop with, and is a prerequisite for interop with C++ iostreams
(which have a virtual base class).
// CHECK:STDERR: fail_todo_use_virtual_inheritance.carbon:[[@LINE+7]]:3: error: cannot implicitly convert expression of type `Cpp.B*` to `Cpp.A*` [ConversionFailure]
302
302
// CHECK:STDERR: return p;
303
303
// CHECK:STDERR: ^~~~~~~~~
304
-
// CHECK:STDERR: fail_todo_use_virtual_inheritance.carbon:[[@LINE+18]]:3: note: while completing C++ type `Cpp.B` [InCppTypeCompletion]
304
+
// CHECK:STDERR: fail_todo_use_virtual_inheritance.carbon:[[@LINE+4]]:3: note: type `Cpp.B*` does not implement interface `Core.ImplicitAs(Cpp.A*)` [MissingImplInMemberAccessNote]
// CHECK:STDERR: fail_todo_use_diamond.carbon:[[@LINE+7]]:3: error: cannot implicitly convert expression of type `Cpp.B*` to `Cpp.A*` [ConversionFailure]
309
337
// CHECK:STDERR: return p;
310
338
// CHECK:STDERR: ^~~~~~~~~
311
-
// CHECK:STDERR: fail_todo_use_virtual_inheritance.carbon:[[@LINE+11]]:3: note: while completing C++ type `Cpp.B` [InCppTypeCompletion]
339
+
// CHECK:STDERR: fail_todo_use_diamond.carbon:[[@LINE+4]]:3: note: type `Cpp.B*` does not implement interface `Core.ImplicitAs(Cpp.A*)` [MissingImplInMemberAccessNote]
312
340
// CHECK:STDERR: return p;
313
341
// CHECK:STDERR: ^~~~~~~~~
314
342
// CHECK:STDERR:
315
-
// CHECK:STDERR: fail_todo_use_virtual_inheritance.carbon:[[@LINE+7]]:3: error: cannot implicitly convert expression of type `Cpp.B*` to `Cpp.A*` [ConversionFailure]
343
+
return p;
344
+
}
345
+
346
+
fnConvertCA(p: Cpp.C*) -> Cpp.A* {
347
+
// CHECK:STDERR: fail_todo_use_diamond.carbon:[[@LINE+7]]:3: error: cannot implicitly convert expression of type `Cpp.C*` to `Cpp.A*` [ConversionFailure]
316
348
// CHECK:STDERR: return p;
317
349
// CHECK:STDERR: ^~~~~~~~~
318
-
// CHECK:STDERR: fail_todo_use_virtual_inheritance.carbon:[[@LINE+4]]:3: note: type `Cpp.B*` does not implement interface `Core.ImplicitAs(Cpp.A*)` [MissingImplInMemberAccessNote]
350
+
// CHECK:STDERR: fail_todo_use_diamond.carbon:[[@LINE+4]]:3: note: type `Cpp.C*` does not implement interface `Core.ImplicitAs(Cpp.A*)` [MissingImplInMemberAccessNote]
319
351
// CHECK:STDERR: return p;
320
352
// CHECK:STDERR: ^~~~~~~~~
321
353
// CHECK:STDERR:
322
354
return p;
323
355
}
324
356
357
+
fnConvertDB(p: Cpp.D*) -> Cpp.B* {
358
+
// CHECK:STDERR: fail_todo_use_diamond.carbon:[[@LINE+7]]:3: error: cannot implicitly convert expression of type `Cpp.D*` to `Cpp.B*` [ConversionFailure]
359
+
// CHECK:STDERR: return p;
360
+
// CHECK:STDERR: ^~~~~~~~~
361
+
// CHECK:STDERR: fail_todo_use_diamond.carbon:[[@LINE+4]]:3: note: type `Cpp.D*` does not implement interface `Core.ImplicitAs(Cpp.B*)` [MissingImplInMemberAccessNote]
362
+
// CHECK:STDERR: return p;
363
+
// CHECK:STDERR: ^~~~~~~~~
364
+
// CHECK:STDERR:
365
+
return p;
366
+
}
367
+
368
+
fnConvertDC(p: Cpp.D*) -> Cpp.C* {
369
+
// CHECK:STDERR: fail_todo_use_diamond.carbon:[[@LINE+7]]:3: error: cannot implicitly convert expression of type `Cpp.D*` to `Cpp.C*` [ConversionFailure]
370
+
// CHECK:STDERR: return p;
371
+
// CHECK:STDERR: ^~~~~~~~~
372
+
// CHECK:STDERR: fail_todo_use_diamond.carbon:[[@LINE+4]]:3: note: type `Cpp.D*` does not implement interface `Core.ImplicitAs(Cpp.C*)` [MissingImplInMemberAccessNote]
373
+
// CHECK:STDERR: return p;
374
+
// CHECK:STDERR: ^~~~~~~~~
375
+
// CHECK:STDERR:
376
+
return p;
377
+
}
378
+
379
+
fnAccessBA(d: Cpp.D) -> i32 {
380
+
// CHECK:STDERR: fail_todo_use_diamond.carbon:[[@LINE+7]]:11: error: cannot convert expression of type `Cpp.D` to `Cpp.B` with `as` [ConversionFailure]
381
+
// CHECK:STDERR: return (d as Cpp.B).b;
382
+
// CHECK:STDERR: ^~~~~~~~~~
383
+
// CHECK:STDERR: fail_todo_use_diamond.carbon:[[@LINE+4]]:11: note: type `Cpp.D` does not implement interface `Core.As(Cpp.B)` [MissingImplInMemberAccessNote]
384
+
// CHECK:STDERR: return (d as Cpp.B).b;
385
+
// CHECK:STDERR: ^~~~~~~~~~
386
+
// CHECK:STDERR:
387
+
return (d asCpp.B).b;
388
+
}
389
+
390
+
fnAccessCA(d: Cpp.D) -> i32 {
391
+
// CHECK:STDERR: fail_todo_use_diamond.carbon:[[@LINE+7]]:11: error: cannot convert expression of type `Cpp.D` to `Cpp.C` with `as` [ConversionFailure]
392
+
// CHECK:STDERR: return (d as Cpp.C).b;
393
+
// CHECK:STDERR: ^~~~~~~~~~
394
+
// CHECK:STDERR: fail_todo_use_diamond.carbon:[[@LINE+4]]:11: note: type `Cpp.D` does not implement interface `Core.As(Cpp.C)` [MissingImplInMemberAccessNote]
395
+
// CHECK:STDERR: return (d as Cpp.C).b;
396
+
// CHECK:STDERR: ^~~~~~~~~~
397
+
// CHECK:STDERR:
398
+
return (d asCpp.C).b;
399
+
}
400
+
401
+
fnAccessDB(d: Cpp.D) -> i32 {
402
+
// CHECK:STDERR: fail_todo_use_diamond.carbon:[[@LINE+7]]:10: error: cannot implicitly convert expression of type `Cpp.D` to `Cpp.B` [ConversionFailure]
403
+
// CHECK:STDERR: return d.b;
404
+
// CHECK:STDERR: ^~~
405
+
// CHECK:STDERR: fail_todo_use_diamond.carbon:[[@LINE+4]]:10: note: type `Cpp.D` does not implement interface `Core.ImplicitAs(Cpp.B)` [MissingImplInMemberAccessNote]
406
+
// CHECK:STDERR: return d.b;
407
+
// CHECK:STDERR: ^~~
408
+
// CHECK:STDERR:
409
+
return d.b;
410
+
}
411
+
412
+
fnAccessDC(d: Cpp.D) -> i32 {
413
+
// CHECK:STDERR: fail_todo_use_diamond.carbon:[[@LINE+7]]:10: error: cannot implicitly convert expression of type `Cpp.D` to `Cpp.C` [ConversionFailure]
414
+
// CHECK:STDERR: return d.c;
415
+
// CHECK:STDERR: ^~~
416
+
// CHECK:STDERR: fail_todo_use_diamond.carbon:[[@LINE+4]]:10: note: type `Cpp.D` does not implement interface `Core.ImplicitAs(Cpp.C)` [MissingImplInMemberAccessNote]
// CHECK:STDERR: let result: i32 = -Cpp.unsupported;
902
-
// CHECK:STDERR: ^~~~~~~~~~~~~~~~
903
-
// CHECK:STDERR: fail_import_unsupported_in_instantiation_unary.carbon:[[@LINE+4]]:21: note: while completing C++ type `Cpp.Unsupported` [InCppTypeCompletion]
904
-
// CHECK:STDERR: let result: i32 = -Cpp.unsupported;
// CHECK:STDERR: let result: i32 = supported + Cpp.unsupported;
920
-
// CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~~
921
-
// CHECK:STDERR: fail_import_unsupported_in_instantiation_binary.carbon:[[@LINE+4]]:21: note: while completing C++ type `Cpp.Unsupported` [InCppTypeCompletion]
922
-
// CHECK:STDERR: let result: i32 = supported + Cpp.unsupported;
0 commit comments