value.cpp 40 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128
  1. // Part of the Carbon Language project, under the Apache License v2.0 with LLVM
  2. // Exceptions. See /LICENSE for license information.
  3. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  4. #include "explorer/interpreter/value.h"
  5. #include <algorithm>
  6. #include <optional>
  7. #include <string_view>
  8. #include "common/check.h"
  9. #include "common/error.h"
  10. #include "explorer/ast/declaration.h"
  11. #include "explorer/common/arena.h"
  12. #include "explorer/common/error_builders.h"
  13. #include "explorer/interpreter/action.h"
  14. #include "llvm/ADT/STLExtras.h"
  15. #include "llvm/ADT/StringExtras.h"
  16. #include "llvm/Support/Casting.h"
  17. #include "llvm/Support/Error.h"
  18. namespace Carbon {
  19. using llvm::cast;
  20. using llvm::dyn_cast;
  21. using llvm::dyn_cast_or_null;
  22. using llvm::isa;
  23. auto StructValue::FindField(std::string_view name) const
  24. -> std::optional<Nonnull<const Value*>> {
  25. for (const NamedValue& element : elements_) {
  26. if (element.name == name) {
  27. return element.value;
  28. }
  29. }
  30. return std::nullopt;
  31. }
  32. static auto FindClassField(Nonnull<const NominalClassValue*> object,
  33. std::string_view name)
  34. -> std::optional<Nonnull<const Value*>> {
  35. if (auto field = cast<StructValue>(object->inits()).FindField(name)) {
  36. return field;
  37. }
  38. if (object->base().has_value()) {
  39. return FindClassField(object->base().value(), name);
  40. }
  41. return std::nullopt;
  42. }
  43. static auto GetMember(Nonnull<Arena*> arena, Nonnull<const Value*> v,
  44. const FieldPath::Component& field,
  45. SourceLocation source_loc, Nonnull<const Value*> me_value)
  46. -> ErrorOr<Nonnull<const Value*>> {
  47. std::string_view f = field.name();
  48. if (field.witness().has_value()) {
  49. const auto* witness = cast<Witness>(*field.witness());
  50. // Associated constants.
  51. if (const auto* assoc_const =
  52. dyn_cast_or_null<AssociatedConstantDeclaration>(
  53. field.member().declaration().value_or(nullptr))) {
  54. CARBON_CHECK(field.interface()) << "have witness but no interface";
  55. // TODO: Use witness to find the value of the constant.
  56. return arena->New<AssociatedConstant>(v, *field.interface(), assoc_const,
  57. witness);
  58. }
  59. // Associated functions.
  60. if (const auto* impl_witness = dyn_cast<ImplWitness>(witness)) {
  61. if (std::optional<Nonnull<const Declaration*>> mem_decl =
  62. FindMember(f, impl_witness->declaration().members());
  63. mem_decl.has_value()) {
  64. const auto& fun_decl = cast<FunctionDeclaration>(**mem_decl);
  65. if (fun_decl.is_method()) {
  66. return arena->New<BoundMethodValue>(&fun_decl, me_value,
  67. &impl_witness->bindings());
  68. } else {
  69. // Class function.
  70. const auto* fun = cast<FunctionValue>(*fun_decl.constant_value());
  71. return arena->New<FunctionValue>(&fun->declaration(),
  72. &impl_witness->bindings());
  73. }
  74. } else {
  75. return ProgramError(source_loc)
  76. << "member " << f << " not in " << *witness;
  77. }
  78. } else {
  79. return ProgramError(source_loc)
  80. << "member lookup for " << f << " in symbolic " << *witness;
  81. }
  82. }
  83. switch (v->kind()) {
  84. case Value::Kind::StructValue: {
  85. std::optional<Nonnull<const Value*>> field =
  86. cast<StructValue>(*v).FindField(f);
  87. if (field == std::nullopt) {
  88. return ProgramError(source_loc) << "member " << f << " not in " << *v;
  89. }
  90. return *field;
  91. }
  92. case Value::Kind::NominalClassValue: {
  93. const auto& object = cast<NominalClassValue>(*v);
  94. // Look for a field.
  95. if (std::optional<Nonnull<const Value*>> field =
  96. FindClassField(&object, f)) {
  97. return *field;
  98. } else {
  99. // Look for a method in the object's class
  100. const auto& class_type = cast<NominalClassType>(object.type());
  101. std::optional<Nonnull<const FunctionValue*>> func =
  102. FindFunctionWithParents(f, class_type.declaration());
  103. if (!func) {
  104. return ProgramError(source_loc) << "member " << f << " not in " << *v
  105. << " or its " << class_type;
  106. } else if ((*func)->declaration().is_method()) {
  107. // Found a method. Turn it into a bound method.
  108. const auto& m = cast<FunctionValue>(**func);
  109. return arena->New<BoundMethodValue>(&m.declaration(), me_value,
  110. &class_type.bindings());
  111. } else {
  112. // Found a class function
  113. // TODO: This should not be reachable.
  114. return arena->New<FunctionValue>(&(*func)->declaration(),
  115. &class_type.bindings());
  116. }
  117. }
  118. }
  119. case Value::Kind::ChoiceType: {
  120. const auto& choice = cast<ChoiceType>(*v);
  121. if (!choice.FindAlternative(f)) {
  122. return ProgramError(source_loc)
  123. << "alternative " << f << " not in " << *v;
  124. }
  125. return arena->New<AlternativeConstructorValue>(f, choice.name());
  126. }
  127. case Value::Kind::NominalClassType: {
  128. // Access a class function.
  129. const auto& class_type = cast<NominalClassType>(*v);
  130. std::optional<Nonnull<const FunctionValue*>> fun =
  131. FindFunctionWithParents(f, class_type.declaration());
  132. if (fun == std::nullopt) {
  133. return ProgramError(source_loc)
  134. << "class function " << f << " not in " << *v;
  135. }
  136. return arena->New<FunctionValue>(&(*fun)->declaration(),
  137. &class_type.bindings());
  138. }
  139. default:
  140. CARBON_FATAL() << "field access not allowed for value " << *v;
  141. }
  142. }
  143. auto Value::GetMember(Nonnull<Arena*> arena, const FieldPath& path,
  144. SourceLocation source_loc,
  145. Nonnull<const Value*> me_value) const
  146. -> ErrorOr<Nonnull<const Value*>> {
  147. Nonnull<const Value*> value(this);
  148. for (const FieldPath::Component& field : path.components_) {
  149. CARBON_ASSIGN_OR_RETURN(
  150. value, Carbon::GetMember(arena, value, field, source_loc, me_value));
  151. }
  152. return value;
  153. }
  154. static auto SetFieldImpl(
  155. Nonnull<Arena*> arena, Nonnull<const Value*> value,
  156. std::vector<FieldPath::Component>::const_iterator path_begin,
  157. std::vector<FieldPath::Component>::const_iterator path_end,
  158. Nonnull<const Value*> field_value, SourceLocation source_loc)
  159. -> ErrorOr<Nonnull<const Value*>> {
  160. if (path_begin == path_end) {
  161. return field_value;
  162. }
  163. switch (value->kind()) {
  164. case Value::Kind::StructValue: {
  165. std::vector<NamedValue> elements = cast<StructValue>(*value).elements();
  166. auto it =
  167. llvm::find_if(elements, [path_begin](const NamedValue& element) {
  168. return element.name == (*path_begin).name();
  169. });
  170. if (it == elements.end()) {
  171. return ProgramError(source_loc)
  172. << "field " << (*path_begin).name() << " not in " << *value;
  173. }
  174. CARBON_ASSIGN_OR_RETURN(
  175. it->value, SetFieldImpl(arena, it->value, path_begin + 1, path_end,
  176. field_value, source_loc));
  177. return arena->New<StructValue>(elements);
  178. }
  179. case Value::Kind::NominalClassValue: {
  180. const auto& object = cast<NominalClassValue>(*value);
  181. if (auto inits = SetFieldImpl(arena, &object.inits(), path_begin,
  182. path_end, field_value, source_loc);
  183. inits.ok()) {
  184. return arena->New<NominalClassValue>(&object.type(), *inits,
  185. object.base());
  186. } else if (object.base().has_value()) {
  187. auto new_base = SetFieldImpl(arena, object.base().value(), path_begin,
  188. path_end, field_value, source_loc);
  189. if (new_base.ok()) {
  190. return arena->New<NominalClassValue>(
  191. &object.type(), &object.inits(),
  192. cast<NominalClassValue>(*new_base));
  193. }
  194. }
  195. // Failed to match, show full object content
  196. return ProgramError(source_loc)
  197. << "field " << (*path_begin).name() << " not in " << *value;
  198. }
  199. case Value::Kind::TupleType:
  200. case Value::Kind::TupleValue: {
  201. std::vector<Nonnull<const Value*>> elements =
  202. cast<TupleValueBase>(*value).elements();
  203. // TODO(geoffromer): update FieldPath to hold integers as well as strings.
  204. int index = std::stoi(std::string((*path_begin).name()));
  205. if (index < 0 || static_cast<size_t>(index) >= elements.size()) {
  206. return ProgramError(source_loc) << "index " << (*path_begin).name()
  207. << " out of range in " << *value;
  208. }
  209. CARBON_ASSIGN_OR_RETURN(
  210. elements[index], SetFieldImpl(arena, elements[index], path_begin + 1,
  211. path_end, field_value, source_loc));
  212. if (isa<TupleType>(value)) {
  213. return arena->New<TupleType>(elements);
  214. } else {
  215. return arena->New<TupleValue>(elements);
  216. }
  217. }
  218. default:
  219. CARBON_FATAL() << "field access not allowed for value " << *value;
  220. }
  221. }
  222. auto Value::SetField(Nonnull<Arena*> arena, const FieldPath& path,
  223. Nonnull<const Value*> field_value,
  224. SourceLocation source_loc) const
  225. -> ErrorOr<Nonnull<const Value*>> {
  226. return SetFieldImpl(arena, static_cast<Nonnull<const Value*>>(this),
  227. path.components_.begin(), path.components_.end(),
  228. field_value, source_loc);
  229. }
  230. static auto PrintNameWithBindings(llvm::raw_ostream& out,
  231. Nonnull<const Declaration*> declaration,
  232. const BindingMap& args) {
  233. out << GetName(*declaration).value_or("(anonymous)");
  234. // TODO: Print '()' if declaration is parameterized but no args are provided.
  235. if (!args.empty()) {
  236. out << "(";
  237. llvm::ListSeparator sep;
  238. for (const auto& [bind, val] : args) {
  239. out << sep << bind->name() << " = " << *val;
  240. }
  241. out << ")";
  242. }
  243. }
  244. void Value::Print(llvm::raw_ostream& out) const {
  245. switch (kind()) {
  246. case Value::Kind::AlternativeConstructorValue: {
  247. const auto& alt = cast<AlternativeConstructorValue>(*this);
  248. out << alt.choice_name() << "." << alt.alt_name();
  249. break;
  250. }
  251. case Value::Kind::BindingPlaceholderValue: {
  252. const auto& placeholder = cast<BindingPlaceholderValue>(*this);
  253. out << "Placeholder<";
  254. if (placeholder.value_node().has_value()) {
  255. out << (*placeholder.value_node());
  256. } else {
  257. out << "_";
  258. }
  259. out << ">";
  260. break;
  261. }
  262. case Value::Kind::AddrValue: {
  263. const auto& addr = cast<AddrValue>(*this);
  264. out << "Addr<" << addr.pattern() << ">";
  265. break;
  266. }
  267. case Value::Kind::AlternativeValue: {
  268. const auto& alt = cast<AlternativeValue>(*this);
  269. out << "alt " << alt.choice_name() << "." << alt.alt_name() << " "
  270. << alt.argument();
  271. break;
  272. }
  273. case Value::Kind::StructValue: {
  274. const auto& struct_val = cast<StructValue>(*this);
  275. out << "{";
  276. llvm::ListSeparator sep;
  277. for (const NamedValue& element : struct_val.elements()) {
  278. out << sep << "." << element.name << " = " << *element.value;
  279. }
  280. out << "}";
  281. break;
  282. }
  283. case Value::Kind::NominalClassValue: {
  284. const auto& s = cast<NominalClassValue>(*this);
  285. out << cast<NominalClassType>(s.type()).declaration().name() << s.inits();
  286. if (s.base().has_value()) {
  287. out << " base " << *s.base().value();
  288. }
  289. break;
  290. }
  291. case Value::Kind::TupleType:
  292. case Value::Kind::TupleValue: {
  293. out << "(";
  294. llvm::ListSeparator sep;
  295. for (Nonnull<const Value*> element :
  296. cast<TupleValueBase>(*this).elements()) {
  297. out << sep << *element;
  298. }
  299. out << ")";
  300. break;
  301. }
  302. case Value::Kind::IntValue:
  303. out << cast<IntValue>(*this).value();
  304. break;
  305. case Value::Kind::BoolValue:
  306. out << (cast<BoolValue>(*this).value() ? "true" : "false");
  307. break;
  308. case Value::Kind::DestructorValue: {
  309. const auto& destructor = cast<DestructorValue>(*this);
  310. out << "destructor [ ";
  311. out << destructor.declaration().me_pattern();
  312. out << " ]";
  313. break;
  314. }
  315. case Value::Kind::FunctionValue: {
  316. const auto& fun = cast<FunctionValue>(*this);
  317. out << "fun<" << fun.declaration().name() << ">";
  318. if (!fun.type_args().empty()) {
  319. out << "[";
  320. llvm::ListSeparator sep;
  321. for (const auto& [ty_var, ty_arg] : fun.type_args()) {
  322. out << sep << *ty_var << "=" << *ty_arg;
  323. }
  324. out << "]";
  325. }
  326. if (!fun.witnesses().empty()) {
  327. out << "{|";
  328. llvm::ListSeparator sep;
  329. for (const auto& [impl_bind, witness] : fun.witnesses()) {
  330. out << sep << *witness;
  331. }
  332. out << "|}";
  333. }
  334. break;
  335. }
  336. case Value::Kind::BoundMethodValue: {
  337. const auto& method = cast<BoundMethodValue>(*this);
  338. out << "bound_method<" << method.declaration().name() << ">";
  339. if (!method.type_args().empty()) {
  340. out << "[";
  341. llvm::ListSeparator sep;
  342. for (const auto& [ty_var, ty_arg] : method.type_args()) {
  343. out << sep << *ty_var << "=" << *ty_arg;
  344. }
  345. out << "]";
  346. }
  347. if (!method.witnesses().empty()) {
  348. out << "{|";
  349. llvm::ListSeparator sep;
  350. for (const auto& [impl_bind, witness] : method.witnesses()) {
  351. out << sep << *witness;
  352. }
  353. out << "|}";
  354. }
  355. break;
  356. }
  357. case Value::Kind::PointerValue:
  358. out << "ptr<" << cast<PointerValue>(*this).address() << ">";
  359. break;
  360. case Value::Kind::LValue:
  361. out << "lval<" << cast<LValue>(*this).address() << ">";
  362. break;
  363. case Value::Kind::BoolType:
  364. out << "bool";
  365. break;
  366. case Value::Kind::IntType:
  367. out << "i32";
  368. break;
  369. case Value::Kind::TypeType:
  370. out << "Type";
  371. break;
  372. case Value::Kind::AutoType:
  373. out << "auto";
  374. break;
  375. case Value::Kind::ContinuationType:
  376. out << "Continuation";
  377. break;
  378. case Value::Kind::PointerType:
  379. out << cast<PointerType>(*this).type() << "*";
  380. break;
  381. case Value::Kind::FunctionType: {
  382. const auto& fn_type = cast<FunctionType>(*this);
  383. out << "fn ";
  384. if (!fn_type.deduced_bindings().empty()) {
  385. out << "[";
  386. llvm::ListSeparator sep;
  387. for (Nonnull<const GenericBinding*> deduced :
  388. fn_type.deduced_bindings()) {
  389. out << sep << *deduced;
  390. }
  391. out << "]";
  392. }
  393. out << fn_type.parameters() << " -> " << fn_type.return_type();
  394. break;
  395. }
  396. case Value::Kind::StructType: {
  397. out << "{";
  398. llvm::ListSeparator sep;
  399. for (const auto& [name, type] : cast<StructType>(*this).fields()) {
  400. out << sep << "." << name << ": " << *type;
  401. }
  402. out << "}";
  403. break;
  404. }
  405. case Value::Kind::UninitializedValue: {
  406. const auto& uninit = cast<UninitializedValue>(*this);
  407. out << "Uninit<" << uninit.pattern() << ">";
  408. break;
  409. }
  410. case Value::Kind::NominalClassType: {
  411. const auto& class_type = cast<NominalClassType>(*this);
  412. out << "class ";
  413. PrintNameWithBindings(out, &class_type.declaration(),
  414. class_type.type_args());
  415. if (!class_type.witnesses().empty()) {
  416. out << " witnesses ";
  417. llvm::ListSeparator sep;
  418. for (const auto& [impl_bind, witness] : class_type.witnesses()) {
  419. out << sep << *witness;
  420. }
  421. }
  422. break;
  423. }
  424. case Value::Kind::MixinPseudoType: {
  425. const auto& mixin_type = cast<MixinPseudoType>(*this);
  426. out << "mixin ";
  427. PrintNameWithBindings(out, &mixin_type.declaration(), mixin_type.args());
  428. if (!mixin_type.witnesses().empty()) {
  429. out << " witnesses ";
  430. llvm::ListSeparator sep;
  431. for (const auto& [impl_bind, witness] : mixin_type.witnesses()) {
  432. out << sep << *witness;
  433. }
  434. }
  435. // TODO: print the import interface
  436. break;
  437. }
  438. case Value::Kind::InterfaceType: {
  439. const auto& iface_type = cast<InterfaceType>(*this);
  440. out << "interface ";
  441. PrintNameWithBindings(out, &iface_type.declaration(),
  442. iface_type.bindings().args());
  443. break;
  444. }
  445. case Value::Kind::NamedConstraintType: {
  446. const auto& constraint_type = cast<NamedConstraintType>(*this);
  447. out << "constraint ";
  448. PrintNameWithBindings(out, &constraint_type.declaration(),
  449. constraint_type.bindings().args());
  450. break;
  451. }
  452. case Value::Kind::ConstraintType: {
  453. const auto& constraint = cast<ConstraintType>(*this);
  454. llvm::ListSeparator combine(" & ");
  455. for (const LookupContext& ctx : constraint.lookup_contexts()) {
  456. out << combine << *ctx.context;
  457. }
  458. if (constraint.lookup_contexts().empty()) {
  459. out << "Type";
  460. }
  461. out << " where ";
  462. llvm::ListSeparator sep(" and ");
  463. for (const RewriteConstraint& rewrite :
  464. constraint.rewrite_constraints()) {
  465. out << sep << ".(";
  466. PrintNameWithBindings(out, &rewrite.constant->interface().declaration(),
  467. rewrite.constant->interface().args());
  468. out << "." << *GetName(rewrite.constant->constant())
  469. << ") = " << *rewrite.unconverted_replacement;
  470. }
  471. for (const ImplConstraint& impl : constraint.impl_constraints()) {
  472. // TODO: Skip cases where `impl.type` is `.Self` and the interface is
  473. // in `lookup_contexts()`.
  474. out << sep << *impl.type << " is " << *impl.interface;
  475. }
  476. for (const EqualityConstraint& equality :
  477. constraint.equality_constraints()) {
  478. out << sep;
  479. llvm::ListSeparator equal(" == ");
  480. for (Nonnull<const Value*> value : equality.values) {
  481. out << equal << *value;
  482. }
  483. }
  484. break;
  485. }
  486. case Value::Kind::ImplWitness: {
  487. const auto& witness = cast<ImplWitness>(*this);
  488. out << "witness for impl " << *witness.declaration().impl_type() << " as "
  489. << witness.declaration().interface();
  490. break;
  491. }
  492. case Value::Kind::BindingWitness: {
  493. const auto& witness = cast<BindingWitness>(*this);
  494. out << "witness for " << *witness.binding()->type_var();
  495. break;
  496. }
  497. case Value::Kind::ConstraintWitness: {
  498. const auto& witness = cast<ConstraintWitness>(*this);
  499. out << "(";
  500. llvm::ListSeparator sep;
  501. for (const auto* elem : witness.witnesses()) {
  502. out << sep << *elem;
  503. }
  504. out << ")";
  505. break;
  506. }
  507. case Value::Kind::ConstraintImplWitness: {
  508. const auto& witness = cast<ConstraintImplWitness>(*this);
  509. out << "witness " << witness.index() << " of "
  510. << *witness.constraint_witness();
  511. break;
  512. }
  513. case Value::Kind::ParameterizedEntityName:
  514. out << *GetName(cast<ParameterizedEntityName>(*this).declaration());
  515. break;
  516. case Value::Kind::MemberName: {
  517. const auto& member_name = cast<MemberName>(*this);
  518. if (member_name.base_type().has_value()) {
  519. out << *member_name.base_type().value();
  520. }
  521. if (member_name.base_type().has_value() &&
  522. member_name.interface().has_value()) {
  523. out << "(";
  524. }
  525. if (member_name.interface().has_value()) {
  526. out << *member_name.interface().value();
  527. }
  528. out << "." << member_name.name();
  529. if (member_name.base_type().has_value() &&
  530. member_name.interface().has_value()) {
  531. out << ")";
  532. }
  533. break;
  534. }
  535. case Value::Kind::ChoiceType:
  536. out << "choice " << cast<ChoiceType>(*this).name();
  537. break;
  538. case Value::Kind::VariableType:
  539. out << cast<VariableType>(*this).binding().name();
  540. break;
  541. case Value::Kind::AssociatedConstant: {
  542. const auto& assoc = cast<AssociatedConstant>(*this);
  543. out << "(" << assoc.base() << ").(";
  544. PrintNameWithBindings(out, &assoc.interface().declaration(),
  545. assoc.interface().args());
  546. out << "." << *GetName(assoc.constant()) << ")";
  547. break;
  548. }
  549. case Value::Kind::ContinuationValue: {
  550. out << cast<ContinuationValue>(*this).stack();
  551. break;
  552. }
  553. case Value::Kind::StringType:
  554. out << "String";
  555. break;
  556. case Value::Kind::StringValue:
  557. out << "\"";
  558. out.write_escaped(cast<StringValue>(*this).value());
  559. out << "\"";
  560. break;
  561. case Value::Kind::TypeOfMixinPseudoType:
  562. out << "typeof("
  563. << cast<TypeOfMixinPseudoType>(*this)
  564. .mixin_type()
  565. .declaration()
  566. .name()
  567. << ")";
  568. break;
  569. case Value::Kind::TypeOfParameterizedEntityName:
  570. out << "parameterized entity name "
  571. << cast<TypeOfParameterizedEntityName>(*this).name();
  572. break;
  573. case Value::Kind::TypeOfMemberName: {
  574. out << "member name " << cast<TypeOfMemberName>(*this).member().name();
  575. break;
  576. }
  577. case Value::Kind::StaticArrayType: {
  578. const auto& array_type = cast<StaticArrayType>(*this);
  579. out << "[" << array_type.element_type() << "; " << array_type.size()
  580. << "]";
  581. break;
  582. }
  583. }
  584. }
  585. ContinuationValue::StackFragment::~StackFragment() {
  586. CARBON_CHECK(reversed_todo_.empty())
  587. << "All StackFragments must be empty before the Carbon program ends.";
  588. }
  589. void ContinuationValue::StackFragment::StoreReversed(
  590. std::vector<std::unique_ptr<Action>> reversed_todo) {
  591. CARBON_CHECK(reversed_todo_.empty());
  592. reversed_todo_ = std::move(reversed_todo);
  593. }
  594. void ContinuationValue::StackFragment::RestoreTo(
  595. Stack<std::unique_ptr<Action>>& todo) {
  596. while (!reversed_todo_.empty()) {
  597. todo.Push(std::move(reversed_todo_.back()));
  598. reversed_todo_.pop_back();
  599. }
  600. }
  601. void ContinuationValue::StackFragment::Clear() {
  602. // We destroy the underlying Actions explicitly to ensure they're
  603. // destroyed in the correct order.
  604. for (auto& action : reversed_todo_) {
  605. action.reset();
  606. }
  607. reversed_todo_.clear();
  608. }
  609. void ContinuationValue::StackFragment::Print(llvm::raw_ostream& out) const {
  610. out << "{";
  611. llvm::ListSeparator sep(" :: ");
  612. for (const std::unique_ptr<Action>& action : reversed_todo_) {
  613. out << sep << *action;
  614. }
  615. out << "}";
  616. }
  617. // Check whether two binding maps, which are assumed to have the same keys, are
  618. // equal.
  619. static auto BindingMapEqual(
  620. const BindingMap& map1, const BindingMap& map2,
  621. std::optional<Nonnull<const EqualityContext*>> equality_ctx) -> bool {
  622. CARBON_CHECK(map1.size() == map2.size()) << "maps should have same keys";
  623. for (const auto& [key, value] : map1) {
  624. if (!ValueEqual(value, map2.at(key), equality_ctx)) {
  625. return false;
  626. }
  627. }
  628. return true;
  629. }
  630. auto TypeEqual(Nonnull<const Value*> t1, Nonnull<const Value*> t2,
  631. std::optional<Nonnull<const EqualityContext*>> equality_ctx)
  632. -> bool {
  633. if (t1 == t2) {
  634. return true;
  635. }
  636. if (t1->kind() != t2->kind()) {
  637. if (IsValueKindDependent(t1) || IsValueKindDependent(t2)) {
  638. return ValueEqual(t1, t2, equality_ctx);
  639. }
  640. return false;
  641. }
  642. switch (t1->kind()) {
  643. case Value::Kind::PointerType:
  644. return TypeEqual(&cast<PointerType>(*t1).type(),
  645. &cast<PointerType>(*t2).type(), equality_ctx);
  646. case Value::Kind::FunctionType: {
  647. const auto& fn1 = cast<FunctionType>(*t1);
  648. const auto& fn2 = cast<FunctionType>(*t2);
  649. return TypeEqual(&fn1.parameters(), &fn2.parameters(), equality_ctx) &&
  650. TypeEqual(&fn1.return_type(), &fn2.return_type(), equality_ctx);
  651. }
  652. case Value::Kind::StructType: {
  653. const auto& struct1 = cast<StructType>(*t1);
  654. const auto& struct2 = cast<StructType>(*t2);
  655. if (struct1.fields().size() != struct2.fields().size()) {
  656. return false;
  657. }
  658. for (size_t i = 0; i < struct1.fields().size(); ++i) {
  659. if (struct1.fields()[i].name != struct2.fields()[i].name ||
  660. !TypeEqual(struct1.fields()[i].value, struct2.fields()[i].value,
  661. equality_ctx)) {
  662. return false;
  663. }
  664. }
  665. return true;
  666. }
  667. case Value::Kind::NominalClassType: {
  668. const auto& class1 = cast<NominalClassType>(*t1);
  669. const auto& class2 = cast<NominalClassType>(*t2);
  670. return class1.declaration().name() == class2.declaration().name() &&
  671. BindingMapEqual(class1.bindings().args(), class2.bindings().args(),
  672. equality_ctx);
  673. }
  674. case Value::Kind::InterfaceType: {
  675. const auto& iface1 = cast<InterfaceType>(*t1);
  676. const auto& iface2 = cast<InterfaceType>(*t2);
  677. return iface1.declaration().name() == iface2.declaration().name() &&
  678. BindingMapEqual(iface1.bindings().args(), iface2.bindings().args(),
  679. equality_ctx);
  680. }
  681. case Value::Kind::NamedConstraintType: {
  682. const auto& constraint1 = cast<NamedConstraintType>(*t1);
  683. const auto& constraint2 = cast<NamedConstraintType>(*t2);
  684. return constraint1.declaration().name() ==
  685. constraint2.declaration().name() &&
  686. BindingMapEqual(constraint1.bindings().args(),
  687. constraint2.bindings().args(), equality_ctx);
  688. }
  689. case Value::Kind::AssociatedConstant:
  690. // Associated constants are sometimes types.
  691. return ValueEqual(t1, t2, equality_ctx);
  692. case Value::Kind::ConstraintType: {
  693. const auto& constraint1 = cast<ConstraintType>(*t1);
  694. const auto& constraint2 = cast<ConstraintType>(*t2);
  695. if (constraint1.impl_constraints().size() !=
  696. constraint2.impl_constraints().size() ||
  697. constraint1.equality_constraints().size() !=
  698. constraint2.equality_constraints().size() ||
  699. constraint1.lookup_contexts().size() !=
  700. constraint2.lookup_contexts().size()) {
  701. return false;
  702. }
  703. for (size_t i = 0; i < constraint1.impl_constraints().size(); ++i) {
  704. const auto& impl1 = constraint1.impl_constraints()[i];
  705. const auto& impl2 = constraint2.impl_constraints()[i];
  706. if (!TypeEqual(impl1.type, impl2.type, equality_ctx) ||
  707. !TypeEqual(impl1.interface, impl2.interface, equality_ctx)) {
  708. return false;
  709. }
  710. }
  711. for (size_t i = 0; i < constraint1.equality_constraints().size(); ++i) {
  712. const auto& equality1 = constraint1.equality_constraints()[i];
  713. const auto& equality2 = constraint2.equality_constraints()[i];
  714. if (equality1.values.size() != equality2.values.size()) {
  715. return false;
  716. }
  717. for (size_t j = 0; j < equality1.values.size(); ++j) {
  718. if (!ValueEqual(equality1.values[i], equality2.values[i],
  719. equality_ctx)) {
  720. return false;
  721. }
  722. }
  723. }
  724. for (size_t i = 0; i < constraint1.lookup_contexts().size(); ++i) {
  725. const auto& context1 = constraint1.lookup_contexts()[i];
  726. const auto& context2 = constraint2.lookup_contexts()[i];
  727. if (!TypeEqual(context1.context, context2.context, equality_ctx)) {
  728. return false;
  729. }
  730. }
  731. return true;
  732. }
  733. case Value::Kind::ChoiceType:
  734. return cast<ChoiceType>(*t1).name() == cast<ChoiceType>(*t2).name();
  735. case Value::Kind::TupleType:
  736. case Value::Kind::TupleValue: {
  737. const auto& tup1 = cast<TupleValueBase>(*t1);
  738. const auto& tup2 = cast<TupleValueBase>(*t2);
  739. if (tup1.elements().size() != tup2.elements().size()) {
  740. return false;
  741. }
  742. for (size_t i = 0; i < tup1.elements().size(); ++i) {
  743. if (!TypeEqual(tup1.elements()[i], tup2.elements()[i], equality_ctx)) {
  744. return false;
  745. }
  746. }
  747. return true;
  748. }
  749. case Value::Kind::IntType:
  750. case Value::Kind::BoolType:
  751. case Value::Kind::ContinuationType:
  752. case Value::Kind::TypeType:
  753. case Value::Kind::StringType:
  754. return true;
  755. case Value::Kind::VariableType:
  756. return &cast<VariableType>(*t1).binding() ==
  757. &cast<VariableType>(*t2).binding();
  758. case Value::Kind::StaticArrayType: {
  759. const auto& array1 = cast<StaticArrayType>(*t1);
  760. const auto& array2 = cast<StaticArrayType>(*t2);
  761. return TypeEqual(&array1.element_type(), &array2.element_type(),
  762. equality_ctx) &&
  763. array1.size() == array2.size();
  764. }
  765. case Value::Kind::IntValue:
  766. case Value::Kind::BoolValue:
  767. case Value::Kind::DestructorValue:
  768. case Value::Kind::FunctionValue:
  769. case Value::Kind::BoundMethodValue:
  770. case Value::Kind::StructValue:
  771. case Value::Kind::NominalClassValue:
  772. case Value::Kind::AlternativeValue:
  773. case Value::Kind::AlternativeConstructorValue:
  774. case Value::Kind::StringValue:
  775. case Value::Kind::PointerValue:
  776. case Value::Kind::LValue:
  777. case Value::Kind::BindingPlaceholderValue:
  778. case Value::Kind::AddrValue:
  779. case Value::Kind::ContinuationValue:
  780. case Value::Kind::UninitializedValue:
  781. case Value::Kind::ParameterizedEntityName:
  782. case Value::Kind::MemberName:
  783. case Value::Kind::TypeOfParameterizedEntityName:
  784. case Value::Kind::TypeOfMemberName:
  785. case Value::Kind::MixinPseudoType:
  786. case Value::Kind::TypeOfMixinPseudoType:
  787. CARBON_FATAL() << "TypeEqual used to compare non-type values\n"
  788. << *t1 << "\n"
  789. << *t2;
  790. case Value::Kind::ImplWitness:
  791. case Value::Kind::BindingWitness:
  792. case Value::Kind::ConstraintWitness:
  793. case Value::Kind::ConstraintImplWitness:
  794. CARBON_FATAL() << "TypeEqual: unexpected Witness";
  795. break;
  796. case Value::Kind::AutoType:
  797. CARBON_FATAL() << "TypeEqual: unexpected AutoType";
  798. break;
  799. }
  800. }
  801. // Returns true if the two values are known to be equal and are written in the
  802. // same way at the top level.
  803. auto ValueStructurallyEqual(
  804. Nonnull<const Value*> v1, Nonnull<const Value*> v2,
  805. std::optional<Nonnull<const EqualityContext*>> equality_ctx) -> bool {
  806. if (v1 == v2) {
  807. return true;
  808. }
  809. if (v1->kind() != v2->kind()) {
  810. return false;
  811. }
  812. switch (v1->kind()) {
  813. case Value::Kind::IntValue:
  814. return cast<IntValue>(*v1).value() == cast<IntValue>(*v2).value();
  815. case Value::Kind::BoolValue:
  816. return cast<BoolValue>(*v1).value() == cast<BoolValue>(*v2).value();
  817. case Value::Kind::FunctionValue: {
  818. std::optional<Nonnull<const Statement*>> body1 =
  819. cast<FunctionValue>(*v1).declaration().body();
  820. std::optional<Nonnull<const Statement*>> body2 =
  821. cast<FunctionValue>(*v2).declaration().body();
  822. return body1.has_value() == body2.has_value() &&
  823. (!body1.has_value() || *body1 == *body2);
  824. }
  825. case Value::Kind::DestructorValue:
  826. return false;
  827. case Value::Kind::BoundMethodValue: {
  828. const auto& m1 = cast<BoundMethodValue>(*v1);
  829. const auto& m2 = cast<BoundMethodValue>(*v2);
  830. std::optional<Nonnull<const Statement*>> body1 = m1.declaration().body();
  831. std::optional<Nonnull<const Statement*>> body2 = m2.declaration().body();
  832. return ValueEqual(m1.receiver(), m2.receiver(), equality_ctx) &&
  833. body1.has_value() == body2.has_value() &&
  834. (!body1.has_value() || *body1 == *body2);
  835. }
  836. case Value::Kind::TupleType:
  837. case Value::Kind::TupleValue: {
  838. const std::vector<Nonnull<const Value*>>& elements1 =
  839. cast<TupleValueBase>(*v1).elements();
  840. const std::vector<Nonnull<const Value*>>& elements2 =
  841. cast<TupleValueBase>(*v2).elements();
  842. if (elements1.size() != elements2.size()) {
  843. return false;
  844. }
  845. for (size_t i = 0; i < elements1.size(); ++i) {
  846. if (!ValueEqual(elements1[i], elements2[i], equality_ctx)) {
  847. return false;
  848. }
  849. }
  850. return true;
  851. }
  852. case Value::Kind::StructValue: {
  853. const auto& struct_v1 = cast<StructValue>(*v1);
  854. const auto& struct_v2 = cast<StructValue>(*v2);
  855. CARBON_CHECK(struct_v1.elements().size() == struct_v2.elements().size());
  856. for (size_t i = 0; i < struct_v1.elements().size(); ++i) {
  857. CARBON_CHECK(struct_v1.elements()[i].name ==
  858. struct_v2.elements()[i].name);
  859. if (!ValueEqual(struct_v1.elements()[i].value,
  860. struct_v2.elements()[i].value, equality_ctx)) {
  861. return false;
  862. }
  863. }
  864. return true;
  865. }
  866. case Value::Kind::StringValue:
  867. return cast<StringValue>(*v1).value() == cast<StringValue>(*v2).value();
  868. case Value::Kind::ParameterizedEntityName: {
  869. std::optional<std::string_view> name1 =
  870. GetName(cast<ParameterizedEntityName>(v1)->declaration());
  871. std::optional<std::string_view> name2 =
  872. GetName(cast<ParameterizedEntityName>(v2)->declaration());
  873. CARBON_CHECK(name1.has_value() && name2.has_value())
  874. << "parameterized name refers to unnamed declaration";
  875. return *name1 == *name2;
  876. }
  877. case Value::Kind::AssociatedConstant: {
  878. // The witness value is not part of determining value equality.
  879. const auto& assoc1 = cast<AssociatedConstant>(*v1);
  880. const auto& assoc2 = cast<AssociatedConstant>(*v2);
  881. return &assoc1.constant() == &assoc2.constant() &&
  882. TypeEqual(&assoc1.base(), &assoc2.base(), equality_ctx) &&
  883. TypeEqual(&assoc1.interface(), &assoc2.interface(), equality_ctx);
  884. }
  885. case Value::Kind::IntType:
  886. case Value::Kind::BoolType:
  887. case Value::Kind::TypeType:
  888. case Value::Kind::FunctionType:
  889. case Value::Kind::PointerType:
  890. case Value::Kind::AutoType:
  891. case Value::Kind::StructType:
  892. case Value::Kind::NominalClassType:
  893. case Value::Kind::MixinPseudoType:
  894. case Value::Kind::InterfaceType:
  895. case Value::Kind::NamedConstraintType:
  896. case Value::Kind::ConstraintType:
  897. case Value::Kind::ImplWitness:
  898. case Value::Kind::BindingWitness:
  899. case Value::Kind::ConstraintWitness:
  900. case Value::Kind::ConstraintImplWitness:
  901. case Value::Kind::ChoiceType:
  902. case Value::Kind::ContinuationType:
  903. case Value::Kind::VariableType:
  904. case Value::Kind::StringType:
  905. case Value::Kind::TypeOfMixinPseudoType:
  906. case Value::Kind::TypeOfParameterizedEntityName:
  907. case Value::Kind::TypeOfMemberName:
  908. case Value::Kind::StaticArrayType:
  909. return TypeEqual(v1, v2, equality_ctx);
  910. case Value::Kind::NominalClassValue:
  911. case Value::Kind::AlternativeValue:
  912. case Value::Kind::BindingPlaceholderValue:
  913. case Value::Kind::AddrValue:
  914. case Value::Kind::AlternativeConstructorValue:
  915. case Value::Kind::ContinuationValue:
  916. case Value::Kind::PointerValue:
  917. case Value::Kind::LValue:
  918. case Value::Kind::UninitializedValue:
  919. case Value::Kind::MemberName:
  920. // TODO: support pointer comparisons once we have a clearer distinction
  921. // between pointers and lvalues.
  922. CARBON_FATAL() << "ValueEqual does not support this kind of value: "
  923. << *v1;
  924. }
  925. }
  926. // Returns true if the two values are equal and returns false otherwise.
  927. //
  928. // This function implements the `==` operator of Carbon.
  929. auto ValueEqual(Nonnull<const Value*> v1, Nonnull<const Value*> v2,
  930. std::optional<Nonnull<const EqualityContext*>> equality_ctx)
  931. -> bool {
  932. if (v1 == v2) {
  933. return true;
  934. }
  935. // If we're given an equality context, check to see if it knows these values
  936. // are equal. Only perform the check if one or the other value is an
  937. // associated constant; otherwise we should be able to do better by looking
  938. // at the structures of the values.
  939. if (equality_ctx) {
  940. if (IsValueKindDependent(v1)) {
  941. auto visitor = [&](Nonnull<const Value*> maybe_v2) {
  942. return !ValueStructurallyEqual(v2, maybe_v2, equality_ctx);
  943. };
  944. if (!(*equality_ctx)->VisitEqualValues(v1, visitor)) {
  945. return true;
  946. }
  947. }
  948. if (IsValueKindDependent(v2)) {
  949. auto visitor = [&](Nonnull<const Value*> maybe_v1) {
  950. return !ValueStructurallyEqual(v1, maybe_v1, equality_ctx);
  951. };
  952. if (!(*equality_ctx)->VisitEqualValues(v2, visitor)) {
  953. return true;
  954. }
  955. }
  956. }
  957. return ValueStructurallyEqual(v1, v2, equality_ctx);
  958. }
  959. auto EqualityConstraint::VisitEqualValues(
  960. Nonnull<const Value*> value,
  961. llvm::function_ref<bool(Nonnull<const Value*>)> visitor) const -> bool {
  962. // See if the given value is part of this constraint.
  963. auto first_equal = llvm::find_if(values, [value](Nonnull<const Value*> val) {
  964. return ValueEqual(value, val, std::nullopt);
  965. });
  966. if (first_equal == values.end()) {
  967. return true;
  968. }
  969. // The value is in this group; pass all non-identical values in the group
  970. // to the visitor. First visit the values we already compared.
  971. for (const auto* val : llvm::make_range(values.begin(), first_equal)) {
  972. if (!visitor(val)) {
  973. return false;
  974. }
  975. }
  976. // Then visit any remaining non-identical values, skipping the one we already
  977. // found was identical.
  978. ++first_equal;
  979. for (const auto* val : llvm::make_range(first_equal, values.end())) {
  980. if (!ValueEqual(value, val, std::nullopt) && !visitor(val)) {
  981. return false;
  982. }
  983. }
  984. return true;
  985. }
  986. auto ConstraintType::VisitEqualValues(
  987. Nonnull<const Value*> value,
  988. llvm::function_ref<bool(Nonnull<const Value*>)> visitor) const -> bool {
  989. for (const auto& eq : equality_constraints()) {
  990. if (!eq.VisitEqualValues(value, visitor)) {
  991. return false;
  992. }
  993. }
  994. return true;
  995. }
  996. auto ChoiceType::FindAlternative(std::string_view name) const
  997. -> std::optional<Nonnull<const Value*>> {
  998. std::vector<NamedValue> alternatives = declaration_->members();
  999. for (const NamedValue& alternative : alternatives) {
  1000. if (alternative.name == name) {
  1001. return alternative.value;
  1002. }
  1003. }
  1004. return std::nullopt;
  1005. }
  1006. auto FindFunction(std::string_view name,
  1007. llvm::ArrayRef<Nonnull<Declaration*>> members)
  1008. -> std::optional<Nonnull<const FunctionValue*>> {
  1009. for (const auto& member : members) {
  1010. switch (member->kind()) {
  1011. case DeclarationKind::MixDeclaration: {
  1012. const auto& mix_decl = cast<MixDeclaration>(*member);
  1013. Nonnull<const MixinPseudoType*> mixin = &mix_decl.mixin_value();
  1014. const auto res = mixin->FindFunction(name);
  1015. if (res.has_value()) {
  1016. return res;
  1017. }
  1018. break;
  1019. }
  1020. case DeclarationKind::FunctionDeclaration: {
  1021. const auto& fun = cast<CallableDeclaration>(*member);
  1022. if (fun.name() == name) {
  1023. return &cast<FunctionValue>(**fun.constant_value());
  1024. }
  1025. break;
  1026. }
  1027. default:
  1028. break;
  1029. }
  1030. }
  1031. return std::nullopt;
  1032. }
  1033. // TODO: Find out a way to remove code duplication
  1034. auto MixinPseudoType::FindFunction(const std::string_view& name) const
  1035. -> std::optional<Nonnull<const FunctionValue*>> {
  1036. for (const auto& member : declaration().members()) {
  1037. switch (member->kind()) {
  1038. case DeclarationKind::MixDeclaration: {
  1039. const auto& mix_decl = cast<MixDeclaration>(*member);
  1040. Nonnull<const MixinPseudoType*> mixin = &mix_decl.mixin_value();
  1041. const auto res = mixin->FindFunction(name);
  1042. if (res.has_value()) {
  1043. return res;
  1044. }
  1045. break;
  1046. }
  1047. case DeclarationKind::FunctionDeclaration: {
  1048. const auto& fun = cast<CallableDeclaration>(*member);
  1049. if (fun.name() == name) {
  1050. return &cast<FunctionValue>(**fun.constant_value());
  1051. }
  1052. break;
  1053. }
  1054. default:
  1055. break;
  1056. }
  1057. }
  1058. return std::nullopt;
  1059. }
  1060. auto FindFunctionWithParents(std::string_view name,
  1061. const ClassDeclaration& class_decl)
  1062. -> std::optional<Nonnull<const FunctionValue*>> {
  1063. if (auto fun = FindFunction(name, class_decl.members()); fun.has_value()) {
  1064. return fun;
  1065. }
  1066. if (const auto base_type = class_decl.base_type(); base_type.has_value()) {
  1067. return FindFunctionWithParents(name, base_type.value()->declaration());
  1068. }
  1069. return std::nullopt;
  1070. }
  1071. auto FindMember(std::string_view name,
  1072. llvm::ArrayRef<Nonnull<Declaration*>> members)
  1073. -> std::optional<Nonnull<const Declaration*>> {
  1074. for (Nonnull<const Declaration*> member : members) {
  1075. if (std::optional<std::string_view> mem_name = GetName(*member);
  1076. mem_name.has_value()) {
  1077. if (*mem_name == name) {
  1078. return member;
  1079. }
  1080. }
  1081. }
  1082. return std::nullopt;
  1083. }
  1084. void ImplBinding::Print(llvm::raw_ostream& out) const {
  1085. out << "impl binding " << *type_var_ << " as " << **iface_;
  1086. }
  1087. void ImplBinding::PrintID(llvm::raw_ostream& out) const {
  1088. out << *type_var_ << " as " << **iface_;
  1089. }
  1090. } // namespace Carbon