Skip to content

Commit e3293a4

Browse files
authored
Improve C++ operator tests by covering unary operator for incomplete and unsupported types (#6135)
Also make sure to test the operator call in `incomplete operand C++ type` test, and not fail before the it. Part of #5995.
1 parent 3bb0d3e commit e3293a4

File tree

1 file changed

+55
-13
lines changed

1 file changed

+55
-13
lines changed

toolchain/check/testdata/interop/cpp/function/operators.carbon

Lines changed: 55 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -761,27 +761,49 @@ fn F() {
761761
class Incomplete;
762762
class Complete {};
763763

764-
auto operator+(Complete lhs, Incomplete rhs) -> Complete;
764+
auto CreateIncomplete() -> Incomplete* _Nonnull;
765765

766-
auto foo(Complete complete) -> void;
766+
// --- fail_import_incomplete_unary.carbon
767767

768-
// --- fail_import_incomplete.carbon
768+
library "[[@TEST_NAME]]";
769+
770+
import Cpp library "incomplete.h";
771+
772+
fn F() {
773+
// CHECK:STDERR: fail_import_incomplete_unary.carbon:[[@LINE+11]]:27: error: looking up a C++ operator with incomplete operand type `Cpp.Incomplete` [IncompleteOperandTypeInCppOperatorLookup]
774+
// CHECK:STDERR: let result_unary: i32 = -*Cpp.CreateIncomplete();
775+
// CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~
776+
// CHECK:STDERR: fail_import_incomplete_unary.carbon:[[@LINE-6]]:10: in file included here [InCppInclude]
777+
// CHECK:STDERR: ./incomplete.h:2:7: note: class was forward declared here [ClassForwardDeclaredHere]
778+
// CHECK:STDERR: class Incomplete;
779+
// CHECK:STDERR: ^
780+
// CHECK:STDERR: fail_import_incomplete_unary.carbon:[[@LINE+4]]:27: note: in `Cpp` operator `Negate` lookup [InCppOperatorLookup]
781+
// CHECK:STDERR: let result_unary: i32 = -*Cpp.CreateIncomplete();
782+
// CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~
783+
// CHECK:STDERR:
784+
let result_unary: i32 = -*Cpp.CreateIncomplete();
785+
}
786+
787+
// --- fail_import_incomplete_binary.carbon
769788

770789
library "[[@TEST_NAME]]";
771790

772791
import Cpp library "incomplete.h";
773792

774793
fn F() {
775-
var c1: Cpp.Complete = Cpp.Complete.Complete();
776-
// CHECK:STDERR: fail_import_incomplete.carbon:[[@LINE+8]]:40: error: invalid use of incomplete type `Cpp.Incomplete` [IncompleteTypeInConversion]
777-
// CHECK:STDERR: let c3: Cpp.Complete = Cpp.foo(c1 + ({} as Cpp.Incomplete));
778-
// CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~
779-
// CHECK:STDERR: fail_import_incomplete.carbon:[[@LINE-7]]:10: in file included here [InCppInclude]
794+
var complete: Cpp.Complete = Cpp.Complete.Complete();
795+
// CHECK:STDERR: fail_import_incomplete_binary.carbon:[[@LINE+11]]:28: error: looking up a C++ operator with incomplete operand type `Cpp.Incomplete` [IncompleteOperandTypeInCppOperatorLookup]
796+
// CHECK:STDERR: let result_binary: i32 = complete + *Cpp.CreateIncomplete();
797+
// CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
798+
// CHECK:STDERR: fail_import_incomplete_binary.carbon:[[@LINE-7]]:10: in file included here [InCppInclude]
780799
// CHECK:STDERR: ./incomplete.h:2:7: note: class was forward declared here [ClassForwardDeclaredHere]
781800
// CHECK:STDERR: class Incomplete;
782801
// CHECK:STDERR: ^
802+
// CHECK:STDERR: fail_import_incomplete_binary.carbon:[[@LINE+4]]:28: note: in `Cpp` operator `AddWith` lookup [InCppOperatorLookup]
803+
// CHECK:STDERR: let result_binary: i32 = complete + *Cpp.CreateIncomplete();
804+
// CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
783805
// CHECK:STDERR:
784-
let c3: Cpp.Complete = Cpp.foo(c1 + ({} as Cpp.Incomplete));
806+
let result_binary: i32 = complete + *Cpp.CreateIncomplete();
785807
}
786808

787809
// ============================================================================
@@ -829,21 +851,41 @@ struct Unsupported : public virtual Supported {};
829851
using UnsupportedAlias = Unsupported<int>;
830852
extern UnsupportedAlias unsupported;
831853

832-
// --- fail_import_unsupported_in_instantiation.carbon
854+
// --- fail_import_unsupported_in_instantiation_unary.carbon
855+
856+
library "[[@TEST_NAME]]";
857+
858+
import Cpp library "unsupported_in_instantiation.h";
859+
860+
fn F() {
861+
// CHECK:STDERR: fail_import_unsupported_in_instantiation_unary.carbon:[[@LINE+10]]:21: error: semantics TODO: `class with virtual bases` [SemanticsTodo]
862+
// CHECK:STDERR: let result: i32 = -Cpp.unsupported;
863+
// CHECK:STDERR: ^~~~~~~~~~~~~~~~
864+
// CHECK:STDERR: fail_import_unsupported_in_instantiation_unary.carbon:[[@LINE+7]]:21: note: while completing C++ type `Cpp.Unsupported` [InCppTypeCompletion]
865+
// CHECK:STDERR: let result: i32 = -Cpp.unsupported;
866+
// CHECK:STDERR: ^~~~~~~~~~~~~~~~
867+
// CHECK:STDERR: fail_import_unsupported_in_instantiation_unary.carbon:[[@LINE+4]]:21: note: in `Cpp` operator `Negate` lookup [InCppOperatorLookup]
868+
// CHECK:STDERR: let result: i32 = -Cpp.unsupported;
869+
// CHECK:STDERR: ^~~~~~~~~~~~~~~~
870+
// CHECK:STDERR:
871+
let result: i32 = -Cpp.unsupported;
872+
}
873+
874+
// --- fail_import_unsupported_in_instantiation_binary.carbon
833875

834876
library "[[@TEST_NAME]]";
835877

836878
import Cpp library "unsupported_in_instantiation.h";
837879

838880
fn F() {
839881
var supported: Cpp.Supported = Cpp.Supported.Supported();
840-
// CHECK:STDERR: fail_import_unsupported_in_instantiation.carbon:[[@LINE+10]]:21: error: semantics TODO: `class with virtual bases` [SemanticsTodo]
882+
// CHECK:STDERR: fail_import_unsupported_in_instantiation_binary.carbon:[[@LINE+10]]:21: error: semantics TODO: `class with virtual bases` [SemanticsTodo]
841883
// CHECK:STDERR: let result: i32 = supported + Cpp.unsupported;
842884
// CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~~
843-
// CHECK:STDERR: fail_import_unsupported_in_instantiation.carbon:[[@LINE+7]]:21: note: while completing C++ type `Cpp.Unsupported` [InCppTypeCompletion]
885+
// CHECK:STDERR: fail_import_unsupported_in_instantiation_binary.carbon:[[@LINE+7]]:21: note: while completing C++ type `Cpp.Unsupported` [InCppTypeCompletion]
844886
// CHECK:STDERR: let result: i32 = supported + Cpp.unsupported;
845887
// CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~~
846-
// CHECK:STDERR: fail_import_unsupported_in_instantiation.carbon:[[@LINE+4]]:21: note: in `Cpp` operator `AddWith` lookup [InCppOperatorLookup]
888+
// CHECK:STDERR: fail_import_unsupported_in_instantiation_binary.carbon:[[@LINE+4]]:21: note: in `Cpp` operator `AddWith` lookup [InCppOperatorLookup]
847889
// CHECK:STDERR: let result: i32 = supported + Cpp.unsupported;
848890
// CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~~
849891
// CHECK:STDERR:

0 commit comments

Comments
 (0)