value.cpp 47 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332
  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/ast/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/ast/element.h"
  12. #include "explorer/ast/element_path.h"
  13. #include "explorer/ast/value_transform.h"
  14. #include "explorer/common/arena.h"
  15. #include "explorer/common/error_builders.h"
  16. #include "llvm/ADT/STLExtras.h"
  17. #include "llvm/ADT/StringExtras.h"
  18. #include "llvm/Support/Casting.h"
  19. #include "llvm/Support/Error.h"
  20. namespace Carbon {
  21. using llvm::cast;
  22. using llvm::dyn_cast;
  23. using llvm::dyn_cast_or_null;
  24. using llvm::isa;
  25. namespace {
  26. // A visitor that walks the Value*s nested within a value.
  27. struct NestedValueVisitor {
  28. template <typename T>
  29. auto VisitParts(const T& decomposable) -> bool {
  30. return decomposable.Decompose(
  31. [&](const auto&... parts) { return (Visit(parts) && ...); });
  32. }
  33. auto Visit(Nonnull<const Value*> value) -> bool {
  34. if (!callback(value)) {
  35. return false;
  36. }
  37. return value->Visit<bool>(
  38. [&](const auto* derived_value) { return VisitParts(*derived_value); });
  39. }
  40. auto Visit(Nonnull<const Bindings*> bindings) -> bool {
  41. for (auto [binding, value] : bindings->args()) {
  42. if (!Visit(value)) {
  43. return false;
  44. }
  45. }
  46. for (auto [binding, value] : bindings->witnesses()) {
  47. if (!Visit(value)) {
  48. return false;
  49. }
  50. }
  51. return true;
  52. }
  53. template <typename T>
  54. auto Visit(const std::vector<T>& vec) -> bool {
  55. for (auto& v : vec) {
  56. if (!Visit(v)) {
  57. return false;
  58. }
  59. }
  60. return true;
  61. }
  62. template <typename T>
  63. auto Visit(const std::optional<T>& opt) -> bool {
  64. return !opt || Visit(*opt);
  65. }
  66. template <typename T,
  67. typename = std::enable_if_t<IsRecursivelyTransformable<T>>>
  68. auto Visit(Nonnull<const T*> value) -> bool {
  69. return VisitParts(*value);
  70. }
  71. template <typename T,
  72. typename = std::enable_if_t<IsRecursivelyTransformable<T>>>
  73. auto Visit(const T& value) -> bool {
  74. return VisitParts(value);
  75. }
  76. // Other value components can't refer to a value.
  77. auto Visit(Nonnull<const AstNode*>) -> bool { return true; }
  78. auto Visit(ValueNodeView) -> bool { return true; }
  79. auto Visit(int) -> bool { return true; }
  80. auto Visit(Address) -> bool { return true; }
  81. auto Visit(const std::string&) -> bool { return true; }
  82. auto Visit(Nonnull<const NominalClassValue**>) -> bool {
  83. // This is the pointer to the most-derived value within a class value,
  84. // which is not "within" this value, so we shouldn't visit it.
  85. return true;
  86. }
  87. auto Visit(const VTable&) -> bool { return true; }
  88. llvm::function_ref<bool(const Value*)> callback;
  89. };
  90. } // namespace
  91. auto VisitNestedValues(Nonnull<const Value*> value,
  92. llvm::function_ref<bool(const Value*)> visitor) -> bool {
  93. return NestedValueVisitor{.callback = visitor}.Visit(value);
  94. }
  95. auto StructValue::FindField(std::string_view name) const
  96. -> std::optional<Nonnull<const Value*>> {
  97. for (const NamedValue& element : elements_) {
  98. if (element.name == name) {
  99. return element.value;
  100. }
  101. }
  102. return std::nullopt;
  103. }
  104. NominalClassValue::NominalClassValue(
  105. Nonnull<const Value*> type, Nonnull<const Value*> inits,
  106. std::optional<Nonnull<const NominalClassValue*>> base,
  107. Nonnull<const NominalClassValue** const> class_value_ptr)
  108. : Value(Kind::NominalClassValue),
  109. type_(type),
  110. inits_(inits),
  111. base_(base),
  112. class_value_ptr_(class_value_ptr) {
  113. // Update ancestors's class value to point to latest child.
  114. *class_value_ptr_ = this;
  115. }
  116. static auto FindClassField(Nonnull<const NominalClassValue*> object,
  117. std::string_view name)
  118. -> std::optional<Nonnull<const Value*>> {
  119. if (auto field = cast<StructValue>(object->inits()).FindField(name)) {
  120. return field;
  121. }
  122. if (object->base().has_value()) {
  123. return FindClassField(object->base().value(), name);
  124. }
  125. return std::nullopt;
  126. }
  127. static auto GetBaseElement(Nonnull<const NominalClassValue*> class_value,
  128. SourceLocation source_loc)
  129. -> ErrorOr<Nonnull<const Value*>> {
  130. const auto base = cast<NominalClassValue>(class_value)->base();
  131. if (!base.has_value()) {
  132. return ProgramError(source_loc)
  133. << "Non-existent base class for " << *class_value;
  134. }
  135. return base.value();
  136. }
  137. static auto GetPositionalElement(Nonnull<const TupleValue*> tuple,
  138. const ElementPath::Component& path_comp,
  139. SourceLocation source_loc)
  140. -> ErrorOr<Nonnull<const Value*>> {
  141. CARBON_CHECK(path_comp.element()->kind() == ElementKind::PositionalElement)
  142. << "Invalid non-tuple member";
  143. const auto* tuple_element = cast<PositionalElement>(path_comp.element());
  144. const size_t index = tuple_element->index();
  145. if (index < 0 || index >= tuple->elements().size()) {
  146. return ProgramError(source_loc)
  147. << "index " << index << " out of range for " << *tuple;
  148. }
  149. return tuple->elements()[index];
  150. }
  151. static auto GetNamedElement(Nonnull<Arena*> arena, Nonnull<const Value*> v,
  152. const ElementPath::Component& field,
  153. SourceLocation source_loc,
  154. Nonnull<const Value*> me_value)
  155. -> ErrorOr<Nonnull<const Value*>> {
  156. CARBON_CHECK(field.element()->kind() == ElementKind::NamedElement)
  157. << "Invalid element, expecting NamedElement";
  158. const auto* member = cast<NamedElement>(field.element());
  159. const auto f = member->name();
  160. if (field.witness().has_value()) {
  161. const auto* witness = cast<Witness>(*field.witness());
  162. // Associated constants.
  163. if (const auto* assoc_const =
  164. dyn_cast_or_null<AssociatedConstantDeclaration>(
  165. member->declaration().value_or(nullptr))) {
  166. CARBON_CHECK(field.interface()) << "have witness but no interface";
  167. // TODO: Use witness to find the value of the constant.
  168. return arena->New<AssociatedConstant>(v, *field.interface(), assoc_const,
  169. witness);
  170. }
  171. // Associated functions.
  172. if (const auto* impl_witness = dyn_cast<ImplWitness>(witness)) {
  173. if (std::optional<Nonnull<const Declaration*>> mem_decl =
  174. FindMember(f, impl_witness->declaration().members());
  175. mem_decl.has_value()) {
  176. const auto& fun_decl = cast<FunctionDeclaration>(**mem_decl);
  177. if (fun_decl.is_method()) {
  178. return arena->New<BoundMethodValue>(&fun_decl, me_value,
  179. &impl_witness->bindings());
  180. } else {
  181. // Class function.
  182. const auto* fun = cast<FunctionValue>(*fun_decl.constant_value());
  183. return arena->New<FunctionValue>(&fun->declaration(),
  184. &impl_witness->bindings());
  185. }
  186. } else {
  187. return ProgramError(source_loc)
  188. << "member " << f << " not in " << *witness;
  189. }
  190. } else {
  191. return ProgramError(source_loc)
  192. << "member lookup for " << f << " in symbolic " << *witness;
  193. }
  194. }
  195. switch (v->kind()) {
  196. case Value::Kind::StructValue: {
  197. std::optional<Nonnull<const Value*>> field =
  198. cast<StructValue>(*v).FindField(f);
  199. if (field == std::nullopt) {
  200. return ProgramError(source_loc) << "member " << f << " not in " << *v;
  201. }
  202. return *field;
  203. }
  204. case Value::Kind::NominalClassValue: {
  205. const auto& object = cast<NominalClassValue>(*v);
  206. // Look for a field.
  207. if (std::optional<Nonnull<const Value*>> field =
  208. FindClassField(&object, f)) {
  209. return *field;
  210. } else {
  211. // Look for a method in the object's class
  212. const auto& class_type = cast<NominalClassType>(object.type());
  213. std::optional<Nonnull<const FunctionValue*>> func =
  214. FindFunctionWithParents(f, class_type.declaration());
  215. if (!func) {
  216. return ProgramError(source_loc) << "member " << f << " not in " << *v
  217. << " or its " << class_type;
  218. } else if ((*func)->declaration().is_method()) {
  219. // Found a method. Turn it into a bound method.
  220. const auto& m = cast<FunctionValue>(**func);
  221. if (m.declaration().virt_override() == VirtualOverride::None) {
  222. return arena->New<BoundMethodValue>(&m.declaration(), me_value,
  223. &class_type.bindings());
  224. }
  225. // Method is virtual, get child-most class value and perform vtable
  226. // lookup.
  227. const auto& last_child_value = **object.class_value_ptr();
  228. const auto& last_child_type =
  229. cast<NominalClassType>(last_child_value.type());
  230. const auto res = last_child_type.vtable().find(f);
  231. CARBON_CHECK(res != last_child_type.vtable().end());
  232. const auto [virtual_method, level] = res->second;
  233. const auto level_diff = last_child_type.hierarchy_level() - level;
  234. const auto* m_class_value = &last_child_value;
  235. // Get class value matching the virtual method, and turn it into a
  236. // bound method.
  237. for (int i = 0; i < level_diff; ++i) {
  238. CARBON_CHECK(m_class_value->base())
  239. << "Error trying to access function class value";
  240. m_class_value = *m_class_value->base();
  241. }
  242. return arena->New<BoundMethodValue>(
  243. cast<FunctionDeclaration>(virtual_method), m_class_value,
  244. &class_type.bindings());
  245. } else {
  246. // Found a class function
  247. // TODO: This should not be reachable.
  248. return arena->New<FunctionValue>(&(*func)->declaration(),
  249. &class_type.bindings());
  250. }
  251. }
  252. }
  253. case Value::Kind::ChoiceType: {
  254. const auto& choice = cast<ChoiceType>(*v);
  255. auto alt = choice.declaration().FindAlternative(f);
  256. if (!alt) {
  257. return ProgramError(source_loc)
  258. << "alternative " << f << " not in " << *v;
  259. }
  260. if ((*alt)->parameters()) {
  261. return arena->New<AlternativeConstructorValue>(&choice, *alt);
  262. }
  263. return arena->New<AlternativeValue>(&choice, *alt, std::nullopt);
  264. }
  265. case Value::Kind::NominalClassType: {
  266. // Access a class function.
  267. const auto& class_type = cast<NominalClassType>(*v);
  268. std::optional<Nonnull<const FunctionValue*>> fun =
  269. FindFunctionWithParents(f, class_type.declaration());
  270. if (fun == std::nullopt) {
  271. return ProgramError(source_loc)
  272. << "class function " << f << " not in " << *v;
  273. }
  274. return arena->New<FunctionValue>(&(*fun)->declaration(),
  275. &class_type.bindings());
  276. }
  277. default:
  278. CARBON_FATAL() << "named element access not supported for value " << *v;
  279. }
  280. }
  281. static auto GetElement(Nonnull<Arena*> arena, Nonnull<const Value*> v,
  282. const ElementPath::Component& path_comp,
  283. SourceLocation source_loc,
  284. Nonnull<const Value*> me_value)
  285. -> ErrorOr<Nonnull<const Value*>> {
  286. switch (path_comp.element()->kind()) {
  287. case ElementKind::NamedElement:
  288. return GetNamedElement(arena, v, path_comp, source_loc, me_value);
  289. case ElementKind::PositionalElement: {
  290. if (const auto* tuple = dyn_cast<TupleValue>(v)) {
  291. return GetPositionalElement(tuple, path_comp, source_loc);
  292. } else {
  293. CARBON_FATAL() << "Invalid value for positional element";
  294. }
  295. }
  296. case ElementKind::BaseElement:
  297. switch (v->kind()) {
  298. case Value::Kind::NominalClassValue:
  299. return GetBaseElement(cast<NominalClassValue>(v), source_loc);
  300. case Value::Kind::PointerValue: {
  301. const auto* ptr = cast<PointerValue>(v);
  302. return arena->New<PointerValue>(
  303. ptr->address().ElementAddress(path_comp.element()));
  304. }
  305. default:
  306. CARBON_FATAL() << "Invalid value for base element";
  307. }
  308. }
  309. }
  310. auto Value::GetElement(Nonnull<Arena*> arena, const ElementPath& path,
  311. SourceLocation source_loc,
  312. Nonnull<const Value*> me_value) const
  313. -> ErrorOr<Nonnull<const Value*>> {
  314. Nonnull<const Value*> value(this);
  315. for (const ElementPath::Component& field : path.components_) {
  316. CARBON_ASSIGN_OR_RETURN(
  317. value, Carbon::GetElement(arena, value, field, source_loc, me_value));
  318. }
  319. return value;
  320. }
  321. static auto SetFieldImpl(
  322. Nonnull<Arena*> arena, Nonnull<const Value*> value,
  323. std::vector<ElementPath::Component>::const_iterator path_begin,
  324. std::vector<ElementPath::Component>::const_iterator path_end,
  325. Nonnull<const Value*> field_value, SourceLocation source_loc)
  326. -> ErrorOr<Nonnull<const Value*>> {
  327. if (path_begin == path_end) {
  328. return field_value;
  329. }
  330. switch (value->kind()) {
  331. case Value::Kind::StructValue: {
  332. std::vector<NamedValue> elements = cast<StructValue>(*value).elements();
  333. auto it =
  334. llvm::find_if(elements, [path_begin](const NamedValue& element) {
  335. return (*path_begin).IsNamed(element.name);
  336. });
  337. if (it == elements.end()) {
  338. return ProgramError(source_loc)
  339. << "field " << *path_begin << " not in " << *value;
  340. }
  341. CARBON_ASSIGN_OR_RETURN(
  342. it->value, SetFieldImpl(arena, it->value, path_begin + 1, path_end,
  343. field_value, source_loc));
  344. return arena->New<StructValue>(elements);
  345. }
  346. case Value::Kind::NominalClassValue: {
  347. const auto& object = cast<NominalClassValue>(*value);
  348. if (auto inits = SetFieldImpl(arena, &object.inits(), path_begin,
  349. path_end, field_value, source_loc);
  350. inits.ok()) {
  351. return arena->New<NominalClassValue>(
  352. &object.type(), *inits, object.base(), object.class_value_ptr());
  353. } else if (object.base().has_value()) {
  354. auto new_base = SetFieldImpl(arena, object.base().value(), path_begin,
  355. path_end, field_value, source_loc);
  356. if (new_base.ok()) {
  357. return arena->New<NominalClassValue>(
  358. &object.type(), &object.inits(),
  359. cast<NominalClassValue>(*new_base), object.class_value_ptr());
  360. }
  361. }
  362. // Failed to match, show full object content
  363. return ProgramError(source_loc)
  364. << "field " << *path_begin << " not in " << *value;
  365. }
  366. case Value::Kind::TupleType:
  367. case Value::Kind::TupleValue: {
  368. CARBON_CHECK((*path_begin).element()->kind() ==
  369. ElementKind::PositionalElement)
  370. << "Invalid non-positional member for tuple";
  371. std::vector<Nonnull<const Value*>> elements =
  372. cast<TupleValueBase>(*value).elements();
  373. const size_t index =
  374. cast<PositionalElement>((*path_begin).element())->index();
  375. if (index < 0 || index >= elements.size()) {
  376. return ProgramError(source_loc)
  377. << "index " << index << " out of range in " << *value;
  378. }
  379. CARBON_ASSIGN_OR_RETURN(
  380. elements[index], SetFieldImpl(arena, elements[index], path_begin + 1,
  381. path_end, field_value, source_loc));
  382. if (isa<TupleType>(value)) {
  383. return arena->New<TupleType>(elements);
  384. } else {
  385. return arena->New<TupleValue>(elements);
  386. }
  387. }
  388. default:
  389. CARBON_FATAL() << "field access not allowed for value " << *value;
  390. }
  391. }
  392. auto Value::SetField(Nonnull<Arena*> arena, const ElementPath& path,
  393. Nonnull<const Value*> field_value,
  394. SourceLocation source_loc) const
  395. -> ErrorOr<Nonnull<const Value*>> {
  396. return SetFieldImpl(arena, static_cast<Nonnull<const Value*>>(this),
  397. path.components_.begin(), path.components_.end(),
  398. field_value, source_loc);
  399. }
  400. static auto PrintNameWithBindings(llvm::raw_ostream& out,
  401. Nonnull<const Declaration*> declaration,
  402. const BindingMap& args) {
  403. out << GetName(*declaration).value_or("(anonymous)");
  404. // TODO: Print '()' if declaration is parameterized but no args are provided.
  405. if (!args.empty()) {
  406. out << "(";
  407. llvm::ListSeparator sep;
  408. for (const auto& [bind, val] : args) {
  409. out << sep << bind->name() << " = " << *val;
  410. }
  411. out << ")";
  412. }
  413. }
  414. void Value::Print(llvm::raw_ostream& out) const {
  415. switch (kind()) {
  416. case Value::Kind::AlternativeConstructorValue: {
  417. const auto& alt = cast<AlternativeConstructorValue>(*this);
  418. out << alt.choice().declaration().name() << "."
  419. << alt.alternative().name();
  420. break;
  421. }
  422. case Value::Kind::BindingPlaceholderValue: {
  423. const auto& placeholder = cast<BindingPlaceholderValue>(*this);
  424. out << "Placeholder<";
  425. if (placeholder.value_node().has_value()) {
  426. out << (*placeholder.value_node());
  427. } else {
  428. out << "_";
  429. }
  430. out << ">";
  431. break;
  432. }
  433. case Value::Kind::AddrValue: {
  434. const auto& addr = cast<AddrValue>(*this);
  435. out << "Addr<" << addr.pattern() << ">";
  436. break;
  437. }
  438. case Value::Kind::AlternativeValue: {
  439. const auto& alt = cast<AlternativeValue>(*this);
  440. out << alt.choice().declaration().name() << "."
  441. << alt.alternative().name();
  442. if (auto arg = alt.argument()) {
  443. out << **arg;
  444. }
  445. break;
  446. }
  447. case Value::Kind::StructValue: {
  448. const auto& struct_val = cast<StructValue>(*this);
  449. out << "{";
  450. llvm::ListSeparator sep;
  451. for (const NamedValue& element : struct_val.elements()) {
  452. out << sep << "." << element.name << " = " << *element.value;
  453. }
  454. out << "}";
  455. break;
  456. }
  457. case Value::Kind::NominalClassValue: {
  458. const auto& s = cast<NominalClassValue>(*this);
  459. out << cast<NominalClassType>(s.type()).declaration().name() << s.inits();
  460. if (s.base().has_value()) {
  461. out << " base " << *s.base().value();
  462. }
  463. break;
  464. }
  465. case Value::Kind::TupleType:
  466. case Value::Kind::TupleValue: {
  467. out << "(";
  468. llvm::ListSeparator sep;
  469. const auto elements = cast<TupleValueBase>(*this).elements();
  470. for (Nonnull<const Value*> element : elements) {
  471. out << sep << *element;
  472. }
  473. // Print trailing comma for single element tuples: (i32,).
  474. if (elements.size() == 1) {
  475. out << ",";
  476. }
  477. out << ")";
  478. break;
  479. }
  480. case Value::Kind::IntValue:
  481. out << cast<IntValue>(*this).value();
  482. break;
  483. case Value::Kind::BoolValue:
  484. out << (cast<BoolValue>(*this).value() ? "true" : "false");
  485. break;
  486. case Value::Kind::DestructorValue: {
  487. const auto& destructor = cast<DestructorValue>(*this);
  488. out << "destructor [ ";
  489. out << destructor.declaration().self_pattern();
  490. out << " ]";
  491. break;
  492. }
  493. case Value::Kind::FunctionValue: {
  494. const auto& fun = cast<FunctionValue>(*this);
  495. out << "fun<" << fun.declaration().name() << ">";
  496. if (!fun.type_args().empty()) {
  497. out << "[";
  498. llvm::ListSeparator sep;
  499. for (const auto& [ty_var, ty_arg] : fun.type_args()) {
  500. out << sep << *ty_var << "=" << *ty_arg;
  501. }
  502. out << "]";
  503. }
  504. if (!fun.witnesses().empty()) {
  505. out << "{|";
  506. llvm::ListSeparator sep;
  507. for (const auto& [impl_bind, witness] : fun.witnesses()) {
  508. out << sep << *witness;
  509. }
  510. out << "|}";
  511. }
  512. break;
  513. }
  514. case Value::Kind::BoundMethodValue: {
  515. const auto& method = cast<BoundMethodValue>(*this);
  516. out << "bound_method<" << method.declaration().name() << ">";
  517. if (!method.type_args().empty()) {
  518. out << "[";
  519. llvm::ListSeparator sep;
  520. for (const auto& [ty_var, ty_arg] : method.type_args()) {
  521. out << sep << *ty_var << "=" << *ty_arg;
  522. }
  523. out << "]";
  524. }
  525. if (!method.witnesses().empty()) {
  526. out << "{|";
  527. llvm::ListSeparator sep;
  528. for (const auto& [impl_bind, witness] : method.witnesses()) {
  529. out << sep << *witness;
  530. }
  531. out << "|}";
  532. }
  533. break;
  534. }
  535. case Value::Kind::PointerValue:
  536. out << "ptr<" << cast<PointerValue>(*this).address() << ">";
  537. break;
  538. case Value::Kind::LocationValue:
  539. out << "lval<" << cast<LocationValue>(*this).address() << ">";
  540. break;
  541. case Value::Kind::BoolType:
  542. out << "bool";
  543. break;
  544. case Value::Kind::IntType:
  545. out << "i32";
  546. break;
  547. case Value::Kind::TypeType:
  548. out << "type";
  549. break;
  550. case Value::Kind::AutoType:
  551. out << "auto";
  552. break;
  553. case Value::Kind::PointerType:
  554. out << cast<PointerType>(*this).pointee_type() << "*";
  555. break;
  556. case Value::Kind::FunctionType: {
  557. const auto& fn_type = cast<FunctionType>(*this);
  558. out << "fn ";
  559. if (!fn_type.deduced_bindings().empty()) {
  560. out << "[";
  561. llvm::ListSeparator sep;
  562. for (Nonnull<const GenericBinding*> deduced :
  563. fn_type.deduced_bindings()) {
  564. out << sep << *deduced;
  565. }
  566. out << "]";
  567. }
  568. out << fn_type.parameters() << " -> " << fn_type.return_type();
  569. break;
  570. }
  571. case Value::Kind::StructType: {
  572. out << "{";
  573. llvm::ListSeparator sep;
  574. for (const auto& [name, type] : cast<StructType>(*this).fields()) {
  575. out << sep << "." << name << ": " << *type;
  576. }
  577. out << "}";
  578. break;
  579. }
  580. case Value::Kind::UninitializedValue: {
  581. const auto& uninit = cast<UninitializedValue>(*this);
  582. out << "Uninit<" << uninit.pattern() << ">";
  583. break;
  584. }
  585. case Value::Kind::NominalClassType: {
  586. const auto& class_type = cast<NominalClassType>(*this);
  587. out << "class ";
  588. PrintNameWithBindings(out, &class_type.declaration(),
  589. class_type.type_args());
  590. if (!class_type.witnesses().empty()) {
  591. out << " witnesses ";
  592. llvm::ListSeparator sep;
  593. for (const auto& [impl_bind, witness] : class_type.witnesses()) {
  594. out << sep << *witness;
  595. }
  596. }
  597. break;
  598. }
  599. case Value::Kind::ChoiceType: {
  600. const auto& choice_type = cast<ChoiceType>(*this);
  601. out << "choice ";
  602. PrintNameWithBindings(out, &choice_type.declaration(),
  603. choice_type.type_args());
  604. break;
  605. }
  606. case Value::Kind::MixinPseudoType: {
  607. const auto& mixin_type = cast<MixinPseudoType>(*this);
  608. out << "mixin ";
  609. PrintNameWithBindings(out, &mixin_type.declaration(), mixin_type.args());
  610. if (!mixin_type.witnesses().empty()) {
  611. out << " witnesses ";
  612. llvm::ListSeparator sep;
  613. for (const auto& [impl_bind, witness] : mixin_type.witnesses()) {
  614. out << sep << *witness;
  615. }
  616. }
  617. // TODO: print the import interface
  618. break;
  619. }
  620. case Value::Kind::InterfaceType: {
  621. const auto& iface_type = cast<InterfaceType>(*this);
  622. out << "interface ";
  623. PrintNameWithBindings(out, &iface_type.declaration(),
  624. iface_type.bindings().args());
  625. break;
  626. }
  627. case Value::Kind::NamedConstraintType: {
  628. const auto& constraint_type = cast<NamedConstraintType>(*this);
  629. out << "constraint ";
  630. PrintNameWithBindings(out, &constraint_type.declaration(),
  631. constraint_type.bindings().args());
  632. break;
  633. }
  634. case Value::Kind::ConstraintType: {
  635. const auto& constraint = cast<ConstraintType>(*this);
  636. llvm::ListSeparator combine(" & ");
  637. for (const LookupContext& ctx : constraint.lookup_contexts()) {
  638. out << combine << *ctx.context;
  639. }
  640. if (constraint.lookup_contexts().empty()) {
  641. out << "type";
  642. }
  643. out << " where ";
  644. llvm::ListSeparator sep(" and ");
  645. for (const RewriteConstraint& rewrite :
  646. constraint.rewrite_constraints()) {
  647. out << sep << ".(";
  648. PrintNameWithBindings(out, &rewrite.constant->interface().declaration(),
  649. rewrite.constant->interface().args());
  650. out << "." << *GetName(rewrite.constant->constant())
  651. << ") = " << *rewrite.unconverted_replacement;
  652. }
  653. for (const ImplsConstraint& impl : constraint.impls_constraints()) {
  654. // TODO: Skip cases where `impl.type` is `.Self` and the interface is
  655. // in `lookup_contexts()`.
  656. out << sep << *impl.type << " impls " << *impl.interface;
  657. }
  658. for (const EqualityConstraint& equality :
  659. constraint.equality_constraints()) {
  660. out << sep;
  661. llvm::ListSeparator equal(" == ");
  662. for (Nonnull<const Value*> value : equality.values) {
  663. out << equal << *value;
  664. }
  665. }
  666. break;
  667. }
  668. case Value::Kind::ImplWitness: {
  669. const auto& witness = cast<ImplWitness>(*this);
  670. out << "witness for impl " << *witness.declaration().impl_type() << " as "
  671. << witness.declaration().interface();
  672. break;
  673. }
  674. case Value::Kind::BindingWitness: {
  675. const auto& witness = cast<BindingWitness>(*this);
  676. out << "witness for " << *witness.binding()->type_var();
  677. break;
  678. }
  679. case Value::Kind::ConstraintWitness: {
  680. const auto& witness = cast<ConstraintWitness>(*this);
  681. out << "(";
  682. llvm::ListSeparator sep;
  683. for (const auto* elem : witness.witnesses()) {
  684. out << sep << *elem;
  685. }
  686. out << ")";
  687. break;
  688. }
  689. case Value::Kind::ConstraintImplWitness: {
  690. const auto& witness = cast<ConstraintImplWitness>(*this);
  691. out << "witness " << witness.index() << " of "
  692. << *witness.constraint_witness();
  693. break;
  694. }
  695. case Value::Kind::ParameterizedEntityName:
  696. out << *GetName(cast<ParameterizedEntityName>(*this).declaration());
  697. break;
  698. case Value::Kind::MemberName: {
  699. const auto& member_name = cast<MemberName>(*this);
  700. if (member_name.base_type().has_value()) {
  701. out << *member_name.base_type().value();
  702. }
  703. if (member_name.base_type().has_value() &&
  704. member_name.interface().has_value()) {
  705. out << "(";
  706. }
  707. if (member_name.interface().has_value()) {
  708. out << *member_name.interface().value();
  709. }
  710. out << "." << member_name;
  711. if (member_name.base_type().has_value() &&
  712. member_name.interface().has_value()) {
  713. out << ")";
  714. }
  715. break;
  716. }
  717. case Value::Kind::VariableType:
  718. out << cast<VariableType>(*this).binding().name();
  719. break;
  720. case Value::Kind::AssociatedConstant: {
  721. const auto& assoc = cast<AssociatedConstant>(*this);
  722. out << "(" << assoc.base() << ").(";
  723. PrintNameWithBindings(out, &assoc.interface().declaration(),
  724. assoc.interface().args());
  725. out << "." << *GetName(assoc.constant()) << ")";
  726. break;
  727. }
  728. case Value::Kind::StringType:
  729. out << "String";
  730. break;
  731. case Value::Kind::StringValue:
  732. out << "\"";
  733. out.write_escaped(cast<StringValue>(*this).value());
  734. out << "\"";
  735. break;
  736. case Value::Kind::TypeOfMixinPseudoType:
  737. out << "typeof("
  738. << cast<TypeOfMixinPseudoType>(*this)
  739. .mixin_type()
  740. .declaration()
  741. .name()
  742. << ")";
  743. break;
  744. case Value::Kind::TypeOfParameterizedEntityName:
  745. out << "parameterized entity name "
  746. << cast<TypeOfParameterizedEntityName>(*this).name();
  747. break;
  748. case Value::Kind::TypeOfMemberName: {
  749. out << "member name " << cast<TypeOfMemberName>(*this).member();
  750. break;
  751. }
  752. case Value::Kind::TypeOfNamespaceName: {
  753. cast<TypeOfNamespaceName>(*this).namespace_decl()->PrintID(out);
  754. break;
  755. }
  756. case Value::Kind::StaticArrayType: {
  757. const auto& array_type = cast<StaticArrayType>(*this);
  758. out << "[" << array_type.element_type() << ";";
  759. if (array_type.has_size()) {
  760. out << " " << array_type.size();
  761. }
  762. out << "]";
  763. break;
  764. }
  765. }
  766. }
  767. void IntrinsicConstraint::Print(llvm::raw_ostream& out) const {
  768. out << *type << " is ";
  769. switch (kind) {
  770. case IntrinsicConstraint::ImplicitAs:
  771. out << "__intrinsic_implicit_as";
  772. break;
  773. }
  774. if (!arguments.empty()) {
  775. out << "(";
  776. llvm::ListSeparator comma;
  777. for (Nonnull<const Value*> argument : arguments) {
  778. out << comma << *argument;
  779. }
  780. out << ")";
  781. }
  782. }
  783. // Check whether two binding maps, which are assumed to have the same keys, are
  784. // equal.
  785. static auto BindingMapEqual(
  786. const BindingMap& map1, const BindingMap& map2,
  787. std::optional<Nonnull<const EqualityContext*>> equality_ctx) -> bool {
  788. CARBON_CHECK(map1.size() == map2.size()) << "maps should have same keys";
  789. for (const auto& [key, value] : map1) {
  790. if (!ValueEqual(value, map2.at(key), equality_ctx)) {
  791. return false;
  792. }
  793. }
  794. return true;
  795. }
  796. auto TypeEqual(Nonnull<const Value*> t1, Nonnull<const Value*> t2,
  797. std::optional<Nonnull<const EqualityContext*>> equality_ctx)
  798. -> bool {
  799. if (t1 == t2) {
  800. return true;
  801. }
  802. if (t1->kind() != t2->kind()) {
  803. if (IsValueKindDependent(t1) || IsValueKindDependent(t2)) {
  804. return ValueEqual(t1, t2, equality_ctx);
  805. }
  806. return false;
  807. }
  808. switch (t1->kind()) {
  809. case Value::Kind::PointerType:
  810. return TypeEqual(&cast<PointerType>(*t1).pointee_type(),
  811. &cast<PointerType>(*t2).pointee_type(), equality_ctx);
  812. case Value::Kind::FunctionType: {
  813. const auto& fn1 = cast<FunctionType>(*t1);
  814. const auto& fn2 = cast<FunctionType>(*t2);
  815. return TypeEqual(&fn1.parameters(), &fn2.parameters(), equality_ctx) &&
  816. TypeEqual(&fn1.return_type(), &fn2.return_type(), equality_ctx);
  817. }
  818. case Value::Kind::StructType: {
  819. const auto& struct1 = cast<StructType>(*t1);
  820. const auto& struct2 = cast<StructType>(*t2);
  821. if (struct1.fields().size() != struct2.fields().size()) {
  822. return false;
  823. }
  824. for (size_t i = 0; i < struct1.fields().size(); ++i) {
  825. if (struct1.fields()[i].name != struct2.fields()[i].name ||
  826. !TypeEqual(struct1.fields()[i].value, struct2.fields()[i].value,
  827. equality_ctx)) {
  828. return false;
  829. }
  830. }
  831. return true;
  832. }
  833. case Value::Kind::NominalClassType: {
  834. const auto& class1 = cast<NominalClassType>(*t1);
  835. const auto& class2 = cast<NominalClassType>(*t2);
  836. return DeclaresSameEntity(class1.declaration(), class2.declaration()) &&
  837. BindingMapEqual(class1.bindings().args(), class2.bindings().args(),
  838. equality_ctx);
  839. }
  840. case Value::Kind::InterfaceType: {
  841. const auto& iface1 = cast<InterfaceType>(*t1);
  842. const auto& iface2 = cast<InterfaceType>(*t2);
  843. return DeclaresSameEntity(iface1.declaration(), iface2.declaration()) &&
  844. BindingMapEqual(iface1.bindings().args(), iface2.bindings().args(),
  845. equality_ctx);
  846. }
  847. case Value::Kind::NamedConstraintType: {
  848. const auto& constraint1 = cast<NamedConstraintType>(*t1);
  849. const auto& constraint2 = cast<NamedConstraintType>(*t2);
  850. return DeclaresSameEntity(constraint1.declaration(),
  851. constraint2.declaration()) &&
  852. BindingMapEqual(constraint1.bindings().args(),
  853. constraint2.bindings().args(), equality_ctx);
  854. }
  855. case Value::Kind::AssociatedConstant:
  856. // Associated constants are sometimes types.
  857. return ValueEqual(t1, t2, equality_ctx);
  858. case Value::Kind::ConstraintType: {
  859. const auto& constraint1 = cast<ConstraintType>(*t1);
  860. const auto& constraint2 = cast<ConstraintType>(*t2);
  861. if (constraint1.impls_constraints().size() !=
  862. constraint2.impls_constraints().size() ||
  863. constraint1.equality_constraints().size() !=
  864. constraint2.equality_constraints().size() ||
  865. constraint1.lookup_contexts().size() !=
  866. constraint2.lookup_contexts().size()) {
  867. return false;
  868. }
  869. for (size_t i = 0; i < constraint1.impls_constraints().size(); ++i) {
  870. const auto& impl1 = constraint1.impls_constraints()[i];
  871. const auto& impl2 = constraint2.impls_constraints()[i];
  872. if (!TypeEqual(impl1.type, impl2.type, equality_ctx) ||
  873. !TypeEqual(impl1.interface, impl2.interface, equality_ctx)) {
  874. return false;
  875. }
  876. }
  877. for (size_t i = 0; i < constraint1.equality_constraints().size(); ++i) {
  878. const auto& equality1 = constraint1.equality_constraints()[i];
  879. const auto& equality2 = constraint2.equality_constraints()[i];
  880. if (equality1.values.size() != equality2.values.size()) {
  881. return false;
  882. }
  883. for (size_t j = 0; j < equality1.values.size(); ++j) {
  884. if (!ValueEqual(equality1.values[j], equality2.values[j],
  885. equality_ctx)) {
  886. return false;
  887. }
  888. }
  889. }
  890. for (size_t i = 0; i < constraint1.lookup_contexts().size(); ++i) {
  891. const auto& context1 = constraint1.lookup_contexts()[i];
  892. const auto& context2 = constraint2.lookup_contexts()[i];
  893. if (!TypeEqual(context1.context, context2.context, equality_ctx)) {
  894. return false;
  895. }
  896. }
  897. return true;
  898. }
  899. case Value::Kind::ChoiceType: {
  900. const auto& choice1 = cast<ChoiceType>(*t1);
  901. const auto& choice2 = cast<ChoiceType>(*t2);
  902. return DeclaresSameEntity(choice1.declaration(), choice2.declaration()) &&
  903. BindingMapEqual(choice1.type_args(), choice2.type_args(),
  904. equality_ctx);
  905. }
  906. case Value::Kind::TupleType:
  907. case Value::Kind::TupleValue: {
  908. const auto& tup1 = cast<TupleValueBase>(*t1);
  909. const auto& tup2 = cast<TupleValueBase>(*t2);
  910. if (tup1.elements().size() != tup2.elements().size()) {
  911. return false;
  912. }
  913. for (size_t i = 0; i < tup1.elements().size(); ++i) {
  914. if (!TypeEqual(tup1.elements()[i], tup2.elements()[i], equality_ctx)) {
  915. return false;
  916. }
  917. }
  918. return true;
  919. }
  920. case Value::Kind::IntType:
  921. case Value::Kind::BoolType:
  922. case Value::Kind::TypeType:
  923. case Value::Kind::StringType:
  924. return true;
  925. case Value::Kind::VariableType:
  926. return &cast<VariableType>(*t1).binding() ==
  927. &cast<VariableType>(*t2).binding();
  928. case Value::Kind::StaticArrayType: {
  929. const auto& array1 = cast<StaticArrayType>(*t1);
  930. const auto& array2 = cast<StaticArrayType>(*t2);
  931. return TypeEqual(&array1.element_type(), &array2.element_type(),
  932. equality_ctx) &&
  933. array1.size() == array2.size();
  934. }
  935. case Value::Kind::IntValue:
  936. case Value::Kind::BoolValue:
  937. case Value::Kind::DestructorValue:
  938. case Value::Kind::FunctionValue:
  939. case Value::Kind::BoundMethodValue:
  940. case Value::Kind::StructValue:
  941. case Value::Kind::NominalClassValue:
  942. case Value::Kind::AlternativeValue:
  943. case Value::Kind::AlternativeConstructorValue:
  944. case Value::Kind::StringValue:
  945. case Value::Kind::PointerValue:
  946. case Value::Kind::LocationValue:
  947. case Value::Kind::BindingPlaceholderValue:
  948. case Value::Kind::AddrValue:
  949. case Value::Kind::UninitializedValue:
  950. case Value::Kind::ParameterizedEntityName:
  951. case Value::Kind::MemberName:
  952. case Value::Kind::TypeOfParameterizedEntityName:
  953. case Value::Kind::TypeOfMemberName:
  954. case Value::Kind::MixinPseudoType:
  955. case Value::Kind::TypeOfMixinPseudoType:
  956. case Value::Kind::TypeOfNamespaceName:
  957. CARBON_FATAL() << "TypeEqual used to compare non-type values\n"
  958. << *t1 << "\n"
  959. << *t2;
  960. case Value::Kind::ImplWitness:
  961. case Value::Kind::BindingWitness:
  962. case Value::Kind::ConstraintWitness:
  963. case Value::Kind::ConstraintImplWitness:
  964. CARBON_FATAL() << "TypeEqual: unexpected Witness";
  965. break;
  966. case Value::Kind::AutoType:
  967. CARBON_FATAL() << "TypeEqual: unexpected AutoType";
  968. break;
  969. }
  970. }
  971. // Returns true if the two values are known to be equal and are written in the
  972. // same way at the top level.
  973. auto ValueStructurallyEqual(
  974. Nonnull<const Value*> v1, Nonnull<const Value*> v2,
  975. std::optional<Nonnull<const EqualityContext*>> equality_ctx) -> bool {
  976. if (v1 == v2) {
  977. return true;
  978. }
  979. if (v1->kind() != v2->kind()) {
  980. return false;
  981. }
  982. switch (v1->kind()) {
  983. case Value::Kind::IntValue:
  984. return cast<IntValue>(*v1).value() == cast<IntValue>(*v2).value();
  985. case Value::Kind::BoolValue:
  986. return cast<BoolValue>(*v1).value() == cast<BoolValue>(*v2).value();
  987. case Value::Kind::FunctionValue: {
  988. std::optional<Nonnull<const Statement*>> body1 =
  989. cast<FunctionValue>(*v1).declaration().body();
  990. std::optional<Nonnull<const Statement*>> body2 =
  991. cast<FunctionValue>(*v2).declaration().body();
  992. return body1.has_value() == body2.has_value() &&
  993. (!body1.has_value() || *body1 == *body2);
  994. }
  995. case Value::Kind::DestructorValue:
  996. return false;
  997. case Value::Kind::BoundMethodValue: {
  998. const auto& m1 = cast<BoundMethodValue>(*v1);
  999. const auto& m2 = cast<BoundMethodValue>(*v2);
  1000. std::optional<Nonnull<const Statement*>> body1 = m1.declaration().body();
  1001. std::optional<Nonnull<const Statement*>> body2 = m2.declaration().body();
  1002. return ValueEqual(m1.receiver(), m2.receiver(), equality_ctx) &&
  1003. body1.has_value() == body2.has_value() &&
  1004. (!body1.has_value() || *body1 == *body2);
  1005. }
  1006. case Value::Kind::TupleType:
  1007. case Value::Kind::TupleValue: {
  1008. const std::vector<Nonnull<const Value*>>& elements1 =
  1009. cast<TupleValueBase>(*v1).elements();
  1010. const std::vector<Nonnull<const Value*>>& elements2 =
  1011. cast<TupleValueBase>(*v2).elements();
  1012. if (elements1.size() != elements2.size()) {
  1013. return false;
  1014. }
  1015. for (size_t i = 0; i < elements1.size(); ++i) {
  1016. if (!ValueEqual(elements1[i], elements2[i], equality_ctx)) {
  1017. return false;
  1018. }
  1019. }
  1020. return true;
  1021. }
  1022. case Value::Kind::StructValue: {
  1023. const auto& struct_v1 = cast<StructValue>(*v1);
  1024. const auto& struct_v2 = cast<StructValue>(*v2);
  1025. CARBON_CHECK(struct_v1.elements().size() == struct_v2.elements().size());
  1026. for (size_t i = 0; i < struct_v1.elements().size(); ++i) {
  1027. CARBON_CHECK(struct_v1.elements()[i].name ==
  1028. struct_v2.elements()[i].name);
  1029. if (!ValueEqual(struct_v1.elements()[i].value,
  1030. struct_v2.elements()[i].value, equality_ctx)) {
  1031. return false;
  1032. }
  1033. }
  1034. return true;
  1035. }
  1036. case Value::Kind::AlternativeValue: {
  1037. const auto& alt1 = cast<AlternativeValue>(*v1);
  1038. const auto& alt2 = cast<AlternativeValue>(*v2);
  1039. if (!TypeEqual(&alt1.choice(), &alt2.choice(), equality_ctx) ||
  1040. &alt1.alternative() != &alt2.alternative()) {
  1041. return false;
  1042. }
  1043. CARBON_CHECK(alt1.argument().has_value() == alt2.argument().has_value());
  1044. return !alt1.argument().has_value() ||
  1045. ValueEqual(*alt1.argument(), *alt2.argument(), equality_ctx);
  1046. }
  1047. case Value::Kind::StringValue:
  1048. return cast<StringValue>(*v1).value() == cast<StringValue>(*v2).value();
  1049. case Value::Kind::ParameterizedEntityName: {
  1050. std::optional<std::string_view> name1 =
  1051. GetName(cast<ParameterizedEntityName>(v1)->declaration());
  1052. std::optional<std::string_view> name2 =
  1053. GetName(cast<ParameterizedEntityName>(v2)->declaration());
  1054. CARBON_CHECK(name1.has_value() && name2.has_value())
  1055. << "parameterized name refers to unnamed declaration";
  1056. return *name1 == *name2;
  1057. }
  1058. case Value::Kind::AssociatedConstant: {
  1059. // The witness value is not part of determining value equality.
  1060. const auto& assoc1 = cast<AssociatedConstant>(*v1);
  1061. const auto& assoc2 = cast<AssociatedConstant>(*v2);
  1062. return DeclaresSameEntity(assoc1.constant(), assoc2.constant()) &&
  1063. TypeEqual(&assoc1.base(), &assoc2.base(), equality_ctx) &&
  1064. TypeEqual(&assoc1.interface(), &assoc2.interface(), equality_ctx);
  1065. }
  1066. case Value::Kind::IntType:
  1067. case Value::Kind::BoolType:
  1068. case Value::Kind::TypeType:
  1069. case Value::Kind::FunctionType:
  1070. case Value::Kind::PointerType:
  1071. case Value::Kind::AutoType:
  1072. case Value::Kind::StructType:
  1073. case Value::Kind::NominalClassType:
  1074. case Value::Kind::MixinPseudoType:
  1075. case Value::Kind::InterfaceType:
  1076. case Value::Kind::NamedConstraintType:
  1077. case Value::Kind::ConstraintType:
  1078. case Value::Kind::ImplWitness:
  1079. case Value::Kind::BindingWitness:
  1080. case Value::Kind::ConstraintWitness:
  1081. case Value::Kind::ConstraintImplWitness:
  1082. case Value::Kind::ChoiceType:
  1083. case Value::Kind::VariableType:
  1084. case Value::Kind::StringType:
  1085. case Value::Kind::TypeOfMixinPseudoType:
  1086. case Value::Kind::TypeOfParameterizedEntityName:
  1087. case Value::Kind::TypeOfMemberName:
  1088. case Value::Kind::TypeOfNamespaceName:
  1089. case Value::Kind::StaticArrayType:
  1090. return TypeEqual(v1, v2, equality_ctx);
  1091. case Value::Kind::NominalClassValue:
  1092. case Value::Kind::BindingPlaceholderValue:
  1093. case Value::Kind::AddrValue:
  1094. case Value::Kind::AlternativeConstructorValue:
  1095. case Value::Kind::PointerValue:
  1096. case Value::Kind::LocationValue:
  1097. case Value::Kind::UninitializedValue:
  1098. case Value::Kind::MemberName:
  1099. // TODO: support pointer comparisons once we have a clearer distinction
  1100. // between pointers and lvalues.
  1101. CARBON_FATAL() << "ValueEqual does not support this kind of value: "
  1102. << *v1;
  1103. }
  1104. }
  1105. // Returns true if the two values are equal and returns false otherwise.
  1106. //
  1107. // This function implements the `==` operator of Carbon.
  1108. auto ValueEqual(Nonnull<const Value*> v1, Nonnull<const Value*> v2,
  1109. std::optional<Nonnull<const EqualityContext*>> equality_ctx)
  1110. -> bool {
  1111. if (v1 == v2) {
  1112. return true;
  1113. }
  1114. // If we're given an equality context, check to see if it knows these values
  1115. // are equal. Only perform the check if one or the other value is an
  1116. // associated constant; otherwise we should be able to do better by looking
  1117. // at the structures of the values.
  1118. if (equality_ctx) {
  1119. if (IsValueKindDependent(v1)) {
  1120. auto visitor = [&](Nonnull<const Value*> maybe_v2) {
  1121. return !ValueStructurallyEqual(v2, maybe_v2, equality_ctx);
  1122. };
  1123. if (!(*equality_ctx)->VisitEqualValues(v1, visitor)) {
  1124. return true;
  1125. }
  1126. }
  1127. if (IsValueKindDependent(v2)) {
  1128. auto visitor = [&](Nonnull<const Value*> maybe_v1) {
  1129. return !ValueStructurallyEqual(v1, maybe_v1, equality_ctx);
  1130. };
  1131. if (!(*equality_ctx)->VisitEqualValues(v2, visitor)) {
  1132. return true;
  1133. }
  1134. }
  1135. }
  1136. return ValueStructurallyEqual(v1, v2, equality_ctx);
  1137. }
  1138. auto EqualityConstraint::VisitEqualValues(
  1139. Nonnull<const Value*> value,
  1140. llvm::function_ref<bool(Nonnull<const Value*>)> visitor) const -> bool {
  1141. // See if the given value is part of this constraint.
  1142. auto first_equal = llvm::find_if(values, [value](Nonnull<const Value*> val) {
  1143. return ValueEqual(value, val, std::nullopt);
  1144. });
  1145. if (first_equal == values.end()) {
  1146. return true;
  1147. }
  1148. // The value is in this group; pass all non-identical values in the group
  1149. // to the visitor. First visit the values we already compared.
  1150. for (const auto* val : llvm::make_range(values.begin(), first_equal)) {
  1151. if (!visitor(val)) {
  1152. return false;
  1153. }
  1154. }
  1155. // Then visit any remaining non-identical values, skipping the one we already
  1156. // found was identical.
  1157. ++first_equal;
  1158. for (const auto* val : llvm::make_range(first_equal, values.end())) {
  1159. if (!ValueEqual(value, val, std::nullopt) && !visitor(val)) {
  1160. return false;
  1161. }
  1162. }
  1163. return true;
  1164. }
  1165. auto ConstraintType::VisitEqualValues(
  1166. Nonnull<const Value*> value,
  1167. llvm::function_ref<bool(Nonnull<const Value*>)> visitor) const -> bool {
  1168. for (const auto& eq : equality_constraints()) {
  1169. if (!eq.VisitEqualValues(value, visitor)) {
  1170. return false;
  1171. }
  1172. }
  1173. return true;
  1174. }
  1175. auto FindFunction(std::string_view name,
  1176. llvm::ArrayRef<Nonnull<Declaration*>> members)
  1177. -> std::optional<Nonnull<const FunctionValue*>> {
  1178. for (const auto& member : members) {
  1179. switch (member->kind()) {
  1180. case DeclarationKind::MixDeclaration: {
  1181. const auto& mix_decl = cast<MixDeclaration>(*member);
  1182. Nonnull<const MixinPseudoType*> mixin = &mix_decl.mixin_value();
  1183. const auto res = mixin->FindFunction(name);
  1184. if (res.has_value()) {
  1185. return res;
  1186. }
  1187. break;
  1188. }
  1189. case DeclarationKind::FunctionDeclaration: {
  1190. const auto& fun = cast<FunctionDeclaration>(*member);
  1191. if (fun.name().inner_name() == name) {
  1192. return &cast<FunctionValue>(**fun.constant_value());
  1193. }
  1194. break;
  1195. }
  1196. default:
  1197. break;
  1198. }
  1199. }
  1200. return std::nullopt;
  1201. }
  1202. // TODO: Find out a way to remove code duplication
  1203. auto MixinPseudoType::FindFunction(const std::string_view& name) const
  1204. -> std::optional<Nonnull<const FunctionValue*>> {
  1205. for (const auto& member : declaration().members()) {
  1206. switch (member->kind()) {
  1207. case DeclarationKind::MixDeclaration: {
  1208. const auto& mix_decl = cast<MixDeclaration>(*member);
  1209. Nonnull<const MixinPseudoType*> mixin = &mix_decl.mixin_value();
  1210. const auto res = mixin->FindFunction(name);
  1211. if (res.has_value()) {
  1212. return res;
  1213. }
  1214. break;
  1215. }
  1216. case DeclarationKind::FunctionDeclaration: {
  1217. const auto& fun = cast<FunctionDeclaration>(*member);
  1218. if (fun.name().inner_name() == name) {
  1219. return &cast<FunctionValue>(**fun.constant_value());
  1220. }
  1221. break;
  1222. }
  1223. default:
  1224. break;
  1225. }
  1226. }
  1227. return std::nullopt;
  1228. }
  1229. auto FindFunctionWithParents(std::string_view name,
  1230. const ClassDeclaration& class_decl)
  1231. -> std::optional<Nonnull<const FunctionValue*>> {
  1232. if (auto fun = FindFunction(name, class_decl.members()); fun.has_value()) {
  1233. return fun;
  1234. }
  1235. if (const auto base_type = class_decl.base_type(); base_type.has_value()) {
  1236. return FindFunctionWithParents(name, base_type.value()->declaration());
  1237. }
  1238. return std::nullopt;
  1239. }
  1240. auto FindMember(std::string_view name,
  1241. llvm::ArrayRef<Nonnull<Declaration*>> members)
  1242. -> std::optional<Nonnull<const Declaration*>> {
  1243. for (Nonnull<const Declaration*> member : members) {
  1244. if (std::optional<std::string_view> mem_name = GetName(*member);
  1245. mem_name.has_value()) {
  1246. if (*mem_name == name) {
  1247. return member;
  1248. }
  1249. }
  1250. }
  1251. return std::nullopt;
  1252. }
  1253. void ImplBinding::Print(llvm::raw_ostream& out) const {
  1254. out << "impl binding " << *type_var_ << " as " << **iface_;
  1255. }
  1256. void ImplBinding::PrintID(llvm::raw_ostream& out) const {
  1257. out << *type_var_ << " as " << **iface_;
  1258. }
  1259. auto NominalClassType::InheritsClass(Nonnull<const Value*> other) const
  1260. -> bool {
  1261. const auto* other_class = dyn_cast<NominalClassType>(other);
  1262. if (!other_class) {
  1263. return false;
  1264. }
  1265. std::optional<Nonnull<const NominalClassType*>> ancestor_class = this;
  1266. while (ancestor_class) {
  1267. if (TypeEqual(*ancestor_class, other_class, std::nullopt)) {
  1268. return true;
  1269. }
  1270. ancestor_class = (*ancestor_class)->base();
  1271. }
  1272. return false;
  1273. }
  1274. auto ExpressionCategoryToString(ExpressionCategory cat) -> llvm::StringRef {
  1275. switch (cat) {
  1276. case ExpressionCategory::Value:
  1277. return "value";
  1278. case ExpressionCategory::Reference:
  1279. return "reference";
  1280. case ExpressionCategory::Initializing:
  1281. return "initializing";
  1282. }
  1283. }
  1284. } // namespace Carbon