@@ -55,7 +55,7 @@ TEST(StandardLibraryTest, StandardLibraryAddsDecls) {
55
55
std::unique_ptr<TypeCheckerBuilder> builder,
56
56
CreateTypeCheckerBuilder (GetSharedTestingDescriptorPool ()));
57
57
EXPECT_THAT (builder->AddLibrary (StandardCheckerLibrary ()), IsOk ());
58
- EXPECT_THAT (std::move (* builder). Build (), IsOk ());
58
+ EXPECT_THAT (builder-> Build (), IsOk ());
59
59
}
60
60
61
61
TEST (StandardLibraryTest, StandardLibraryErrorsIfAddedTwice) {
@@ -91,7 +91,7 @@ TEST(StandardLibraryTest, ComprehensionVarsIndirectCyclicParamAssignability) {
91
91
IsOk ());
92
92
93
93
ASSERT_OK_AND_ASSIGN (std::unique_ptr<TypeChecker> type_checker,
94
- std::move (* builder). Build ());
94
+ builder-> Build ());
95
95
96
96
ASSERT_OK_AND_ASSIGN (
97
97
auto ast, checker_internal::MakeTestParsedAst (
@@ -106,14 +106,49 @@ TEST(StandardLibraryTest, ComprehensionVarsIndirectCyclicParamAssignability) {
106
106
EXPECT_THAT (result.GetIssues (), IsEmpty ());
107
107
}
108
108
109
+ TEST (StandardLibraryTest, ComprehensionResultTypeIsSubstituted) {
110
+ google::protobuf::Arena arena;
111
+ ASSERT_OK_AND_ASSIGN (
112
+ std::unique_ptr<TypeCheckerBuilder> builder,
113
+ CreateTypeCheckerBuilder (GetSharedTestingDescriptorPool ()));
114
+ ASSERT_THAT (builder->AddLibrary (StandardCheckerLibrary ()), IsOk ());
115
+
116
+ // Test that type for the result list of .map is resolved to a concrete type
117
+ // when it is known. Checks for a bug where the result type is considered to
118
+ // still be flexible and may widen to dyn.
119
+ builder->set_container (" cel.expr.conformance.proto2" );
120
+ ASSERT_OK_AND_ASSIGN (std::unique_ptr<TypeChecker> type_checker,
121
+ builder->Build ());
122
+
123
+ ASSERT_OK_AND_ASSIGN (auto ast, checker_internal::MakeTestParsedAst (
124
+ " [TestAllTypes{}]"
125
+ " .map(x, x.repeated_nested_message[0])"
126
+ " .map(x, x.bb)[0]" ));
127
+ ASSERT_OK_AND_ASSIGN (ValidationResult result,
128
+ type_checker->Check (std::move (ast)));
129
+
130
+ EXPECT_TRUE (result.IsValid ());
131
+
132
+ EXPECT_THAT (result.GetIssues (), IsEmpty ()) << result.FormatError ();
133
+
134
+ ASSERT_OK_AND_ASSIGN (auto checked_ast, result.ReleaseAst ());
135
+
136
+ const ast_internal::AstImpl& checked_impl =
137
+ ast_internal::AstImpl::CastFromPublicAst (*checked_ast);
138
+
139
+ ast_internal::Type type = checked_impl.GetType (checked_impl.root_expr ().id ());
140
+ EXPECT_TRUE (type.has_primitive () &&
141
+ type.primitive () == ast_internal::PrimitiveType::kInt64 );
142
+ }
143
+
109
144
class StandardLibraryDefinitionsTest : public ::testing::Test {
110
145
public:
111
146
void SetUp () override {
112
147
ASSERT_OK_AND_ASSIGN (
113
148
std::unique_ptr<TypeCheckerBuilder> builder,
114
149
CreateTypeCheckerBuilder (GetSharedTestingDescriptorPool ()));
115
150
ASSERT_THAT (builder->AddLibrary (StandardCheckerLibrary ()), IsOk ());
116
- ASSERT_OK_AND_ASSIGN (stdlib_type_checker_, std::move (* builder). Build ());
151
+ ASSERT_OK_AND_ASSIGN (stdlib_type_checker_, builder-> Build ());
117
152
}
118
153
119
154
protected:
@@ -219,7 +254,7 @@ TEST_P(StdLibDefinitionsTest, Runner) {
219
254
GetParam ().options ));
220
255
ASSERT_THAT (builder->AddLibrary (StandardCheckerLibrary ()), IsOk ());
221
256
ASSERT_OK_AND_ASSIGN (std::unique_ptr<TypeChecker> type_checker,
222
- std::move (* builder). Build ());
257
+ builder-> Build ());
223
258
224
259
ASSERT_OK_AND_ASSIGN (std::unique_ptr<Ast> ast,
225
260
checker_internal::MakeTestParsedAst (GetParam ().expr ));
0 commit comments