value.cpp 49 KB

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