value.cpp 49 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372
  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/base/arena.h"
  15. #include "explorer/base/error_builders.h"
  16. #include "llvm/ADT/STLExtras.h"
  17. #include "llvm/ADT/StringExtras.h"
  18. #include "llvm/Support/Casting.h"
  19. namespace Carbon {
  20. using llvm::cast;
  21. using llvm::dyn_cast;
  22. using llvm::dyn_cast_or_null;
  23. using llvm::isa;
  24. namespace {
  25. // A visitor that walks the Value*s nested within a value.
  26. struct NestedValueVisitor {
  27. template <typename T>
  28. auto VisitParts(const T& decomposable) -> bool {
  29. return decomposable.Decompose(
  30. [&](const auto&... parts) { return (Visit(parts) && ...); });
  31. }
  32. auto Visit(Nonnull<const Value*> value) -> bool {
  33. if (!callback(value)) {
  34. return false;
  35. }
  36. return value->Visit<bool>(
  37. [&](const auto* derived_value) { return VisitParts(*derived_value); });
  38. }
  39. auto Visit(Nonnull<const Bindings*> bindings) -> bool {
  40. for (auto [binding, value] : bindings->args()) {
  41. if (!Visit(value)) {
  42. return false;
  43. }
  44. }
  45. for (auto [binding, value] : bindings->witnesses()) {
  46. if (!Visit(value)) {
  47. return false;
  48. }
  49. }
  50. return true;
  51. }
  52. template <typename T>
  53. auto Visit(const std::vector<T>& vec) -> bool {
  54. for (auto& v : vec) {
  55. if (!Visit(v)) {
  56. return false;
  57. }
  58. }
  59. return true;
  60. }
  61. template <typename T>
  62. auto Visit(const std::optional<T>& opt) -> bool {
  63. return !opt || Visit(*opt);
  64. }
  65. template <typename T,
  66. typename = std::enable_if_t<IsRecursivelyTransformable<T>>>
  67. auto Visit(Nonnull<const T*> value) -> bool {
  68. return VisitParts(*value);
  69. }
  70. template <typename T,
  71. typename = std::enable_if_t<IsRecursivelyTransformable<T>>>
  72. auto Visit(const T& value) -> bool {
  73. return VisitParts(value);
  74. }
  75. // Other value components can't refer to a value.
  76. auto Visit(Nonnull<const AstNode*>) -> bool { return true; }
  77. auto Visit(ValueNodeView) -> bool { return true; }
  78. auto Visit(int) -> bool { return true; }
  79. auto Visit(Address) -> bool { return true; }
  80. auto Visit(ExpressionCategory) -> 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. CARBON_CHECK(!base || (*base)->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. std::optional<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. std::optional<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. std::optional<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. auto* class_value_ptr = arena->New<const NominalClassValue*>();
  353. std::vector<const NominalClassValue*> base_path;
  354. for (auto base = object.base(); base; base = (*base)->base()) {
  355. base_path.push_back(*base);
  356. }
  357. std::optional<Nonnull<const NominalClassValue*>> base;
  358. for (auto* base_path_elem : llvm::reverse(base_path)) {
  359. base = arena->New<NominalClassValue>(&base_path_elem->type(),
  360. &base_path_elem->inits(), base,
  361. class_value_ptr);
  362. }
  363. return arena->New<NominalClassValue>(&object.type(), *inits, base,
  364. class_value_ptr);
  365. } else if (object.base().has_value()) {
  366. auto new_base = SetFieldImpl(arena, object.base().value(), path_begin,
  367. path_end, field_value, source_loc);
  368. if (new_base.ok()) {
  369. auto as_nominal_class_value = cast<NominalClassValue>(*new_base);
  370. return arena->New<NominalClassValue>(
  371. &object.type(), &object.inits(), as_nominal_class_value,
  372. as_nominal_class_value->class_value_ptr());
  373. }
  374. }
  375. // Failed to match, show full object content
  376. return ProgramError(source_loc)
  377. << "field " << *path_begin << " not in " << *value;
  378. }
  379. case Value::Kind::TupleType:
  380. case Value::Kind::TupleValue: {
  381. CARBON_CHECK((*path_begin).element()->kind() ==
  382. ElementKind::PositionalElement)
  383. << "Invalid non-positional member for tuple";
  384. std::vector<Nonnull<const Value*>> elements =
  385. cast<TupleValueBase>(*value).elements();
  386. const size_t index =
  387. cast<PositionalElement>((*path_begin).element())->index();
  388. if (index < 0 || index >= elements.size()) {
  389. return ProgramError(source_loc)
  390. << "index " << index << " out of range in " << *value;
  391. }
  392. CARBON_ASSIGN_OR_RETURN(
  393. elements[index], SetFieldImpl(arena, elements[index], path_begin + 1,
  394. path_end, field_value, source_loc));
  395. if (isa<TupleType>(value)) {
  396. return arena->New<TupleType>(elements);
  397. } else {
  398. return arena->New<TupleValue>(elements);
  399. }
  400. }
  401. default:
  402. CARBON_FATAL() << "field access not allowed for value " << *value;
  403. }
  404. }
  405. auto Value::SetField(Nonnull<Arena*> arena, const ElementPath& path,
  406. Nonnull<const Value*> field_value,
  407. SourceLocation source_loc) const
  408. -> ErrorOr<Nonnull<const Value*>> {
  409. return SetFieldImpl(arena, static_cast<Nonnull<const Value*>>(this),
  410. path.components_.begin(), path.components_.end(),
  411. field_value, source_loc);
  412. }
  413. static auto PrintNameWithBindings(llvm::raw_ostream& out,
  414. Nonnull<const Declaration*> declaration,
  415. const BindingMap& args) {
  416. out << GetName(*declaration).value_or("(anonymous)");
  417. // TODO: Print '()' if declaration is parameterized but no args are provided.
  418. if (!args.empty()) {
  419. out << "(";
  420. llvm::ListSeparator sep;
  421. for (const auto& [bind, val] : args) {
  422. out << sep << bind->name() << " = " << *val;
  423. }
  424. out << ")";
  425. }
  426. }
  427. void Value::Print(llvm::raw_ostream& out) const {
  428. switch (kind()) {
  429. case Value::Kind::AlternativeConstructorValue: {
  430. const auto& alt = cast<AlternativeConstructorValue>(*this);
  431. out << alt.choice().declaration().name() << "."
  432. << alt.alternative().name();
  433. break;
  434. }
  435. case Value::Kind::BindingPlaceholderValue: {
  436. const auto& placeholder = cast<BindingPlaceholderValue>(*this);
  437. out << "Placeholder<";
  438. if (placeholder.value_node().has_value()) {
  439. out << (*placeholder.value_node());
  440. } else {
  441. out << "_";
  442. }
  443. out << ">";
  444. break;
  445. }
  446. case Value::Kind::AddrValue: {
  447. const auto& addr = cast<AddrValue>(*this);
  448. out << "Addr<" << addr.pattern() << ">";
  449. break;
  450. }
  451. case Value::Kind::AlternativeValue: {
  452. const auto& alt = cast<AlternativeValue>(*this);
  453. out << alt.choice().declaration().name() << "."
  454. << alt.alternative().name();
  455. if (auto arg = alt.argument()) {
  456. out << **arg;
  457. }
  458. break;
  459. }
  460. case Value::Kind::StructValue: {
  461. const auto& struct_val = cast<StructValue>(*this);
  462. out << "{";
  463. llvm::ListSeparator sep;
  464. for (const NamedValue& element : struct_val.elements()) {
  465. out << sep << "." << element.name << " = " << *element.value;
  466. }
  467. out << "}";
  468. break;
  469. }
  470. case Value::Kind::NominalClassValue: {
  471. const auto& s = cast<NominalClassValue>(*this);
  472. out << cast<NominalClassType>(s.type()).declaration().name() << s.inits();
  473. if (s.base().has_value()) {
  474. out << " base " << *s.base().value();
  475. }
  476. break;
  477. }
  478. case Value::Kind::TupleType:
  479. case Value::Kind::TupleValue: {
  480. out << "(";
  481. llvm::ListSeparator sep;
  482. const auto elements = cast<TupleValueBase>(*this).elements();
  483. for (Nonnull<const Value*> element : elements) {
  484. out << sep << *element;
  485. }
  486. // Print trailing comma for single element tuples: (i32,).
  487. if (elements.size() == 1) {
  488. out << ",";
  489. }
  490. out << ")";
  491. break;
  492. }
  493. case Value::Kind::IntValue:
  494. out << cast<IntValue>(*this).value();
  495. break;
  496. case Value::Kind::BoolValue:
  497. out << (cast<BoolValue>(*this).value() ? "true" : "false");
  498. break;
  499. case Value::Kind::DestructorValue: {
  500. const auto& destructor = cast<DestructorValue>(*this);
  501. out << "destructor [ ";
  502. out << destructor.declaration().self_pattern();
  503. out << " ]";
  504. break;
  505. }
  506. case Value::Kind::FunctionValue: {
  507. const auto& fun = cast<FunctionValue>(*this);
  508. out << "fun<" << fun.declaration().name() << ">";
  509. if (!fun.type_args().empty()) {
  510. out << "[";
  511. llvm::ListSeparator sep;
  512. for (const auto& [ty_var, ty_arg] : fun.type_args()) {
  513. out << sep << *ty_var << "=" << *ty_arg;
  514. }
  515. out << "]";
  516. }
  517. if (!fun.witnesses().empty()) {
  518. out << "{|";
  519. llvm::ListSeparator sep;
  520. for (const auto& [impl_bind, witness] : fun.witnesses()) {
  521. out << sep << *witness;
  522. }
  523. out << "|}";
  524. }
  525. break;
  526. }
  527. case Value::Kind::BoundMethodValue: {
  528. const auto& method = cast<BoundMethodValue>(*this);
  529. out << "bound_method<" << method.declaration().name() << ">";
  530. if (!method.type_args().empty()) {
  531. out << "[";
  532. llvm::ListSeparator sep;
  533. for (const auto& [ty_var, ty_arg] : method.type_args()) {
  534. out << sep << *ty_var << "=" << *ty_arg;
  535. }
  536. out << "]";
  537. }
  538. if (!method.witnesses().empty()) {
  539. out << "{|";
  540. llvm::ListSeparator sep;
  541. for (const auto& [impl_bind, witness] : method.witnesses()) {
  542. out << sep << *witness;
  543. }
  544. out << "|}";
  545. }
  546. break;
  547. }
  548. case Value::Kind::PointerValue:
  549. out << "ptr<" << cast<PointerValue>(*this).address() << ">";
  550. break;
  551. case Value::Kind::LocationValue:
  552. out << "lval<" << cast<LocationValue>(*this).address() << ">";
  553. break;
  554. case Value::Kind::ReferenceExpressionValue:
  555. out << "ref_expr<" << cast<ReferenceExpressionValue>(*this).address()
  556. << ">";
  557. break;
  558. case Value::Kind::BoolType:
  559. out << "bool";
  560. break;
  561. case Value::Kind::IntType:
  562. out << "i32";
  563. break;
  564. case Value::Kind::TypeType:
  565. out << "type";
  566. break;
  567. case Value::Kind::AutoType:
  568. out << "auto";
  569. break;
  570. case Value::Kind::PointerType:
  571. out << cast<PointerType>(*this).pointee_type() << "*";
  572. break;
  573. case Value::Kind::FunctionType: {
  574. const auto& fn_type = cast<FunctionType>(*this);
  575. out << "fn ";
  576. auto self = fn_type.method_self();
  577. if (!fn_type.deduced_bindings().empty() || self.has_value()) {
  578. out << "[";
  579. llvm::ListSeparator sep;
  580. for (Nonnull<const GenericBinding*> deduced :
  581. fn_type.deduced_bindings()) {
  582. out << sep << *deduced;
  583. }
  584. if (self.has_value()) {
  585. if (self->addr_self) {
  586. out << sep << "addr self: " << *self->self_type << "*";
  587. } else {
  588. out << sep << "self: " << *self->self_type;
  589. }
  590. }
  591. out << "]";
  592. }
  593. out << fn_type.parameters() << " -> " << fn_type.return_type();
  594. break;
  595. }
  596. case Value::Kind::StructType: {
  597. out << "{";
  598. llvm::ListSeparator sep;
  599. for (const auto& [name, type] : cast<StructType>(*this).fields()) {
  600. out << sep << "." << name << ": " << *type;
  601. }
  602. out << "}";
  603. break;
  604. }
  605. case Value::Kind::UninitializedValue: {
  606. const auto& uninit = cast<UninitializedValue>(*this);
  607. out << "Uninit<" << uninit.pattern() << ">";
  608. break;
  609. }
  610. case Value::Kind::NominalClassType: {
  611. const auto& class_type = cast<NominalClassType>(*this);
  612. out << "class ";
  613. PrintNameWithBindings(out, &class_type.declaration(),
  614. class_type.type_args());
  615. if (!class_type.witnesses().empty()) {
  616. out << " witnesses ";
  617. llvm::ListSeparator sep;
  618. for (const auto& [impl_bind, witness] : class_type.witnesses()) {
  619. out << sep << *witness;
  620. }
  621. }
  622. break;
  623. }
  624. case Value::Kind::ChoiceType: {
  625. const auto& choice_type = cast<ChoiceType>(*this);
  626. out << "choice ";
  627. PrintNameWithBindings(out, &choice_type.declaration(),
  628. choice_type.type_args());
  629. break;
  630. }
  631. case Value::Kind::MixinPseudoType: {
  632. const auto& mixin_type = cast<MixinPseudoType>(*this);
  633. out << "mixin ";
  634. PrintNameWithBindings(out, &mixin_type.declaration(), mixin_type.args());
  635. if (!mixin_type.witnesses().empty()) {
  636. out << " witnesses ";
  637. llvm::ListSeparator sep;
  638. for (const auto& [impl_bind, witness] : mixin_type.witnesses()) {
  639. out << sep << *witness;
  640. }
  641. }
  642. // TODO: print the import interface
  643. break;
  644. }
  645. case Value::Kind::InterfaceType: {
  646. const auto& iface_type = cast<InterfaceType>(*this);
  647. out << "interface ";
  648. PrintNameWithBindings(out, &iface_type.declaration(),
  649. iface_type.bindings().args());
  650. break;
  651. }
  652. case Value::Kind::NamedConstraintType: {
  653. const auto& constraint_type = cast<NamedConstraintType>(*this);
  654. out << "constraint ";
  655. PrintNameWithBindings(out, &constraint_type.declaration(),
  656. constraint_type.bindings().args());
  657. break;
  658. }
  659. case Value::Kind::ConstraintType: {
  660. const auto& constraint = cast<ConstraintType>(*this);
  661. llvm::ListSeparator combine(" & ");
  662. for (const LookupContext& ctx : constraint.lookup_contexts()) {
  663. out << combine << *ctx.context;
  664. }
  665. if (constraint.lookup_contexts().empty()) {
  666. out << "type";
  667. }
  668. out << " where ";
  669. llvm::ListSeparator sep(" and ");
  670. for (const RewriteConstraint& rewrite :
  671. constraint.rewrite_constraints()) {
  672. out << sep << ".(";
  673. PrintNameWithBindings(out, &rewrite.constant->interface().declaration(),
  674. rewrite.constant->interface().args());
  675. out << "." << *GetName(rewrite.constant->constant())
  676. << ") = " << *rewrite.unconverted_replacement;
  677. }
  678. for (const ImplsConstraint& impl : constraint.impls_constraints()) {
  679. // TODO: Skip cases where `impl.type` is `.Self` and the interface is
  680. // in `lookup_contexts()`.
  681. out << sep << *impl.type << " impls " << *impl.interface;
  682. }
  683. for (const EqualityConstraint& equality :
  684. constraint.equality_constraints()) {
  685. out << sep;
  686. llvm::ListSeparator equal(" == ");
  687. for (Nonnull<const Value*> value : equality.values) {
  688. out << equal << *value;
  689. }
  690. }
  691. break;
  692. }
  693. case Value::Kind::ImplWitness: {
  694. const auto& witness = cast<ImplWitness>(*this);
  695. out << "witness for impl " << *witness.declaration().impl_type() << " as "
  696. << witness.declaration().interface();
  697. break;
  698. }
  699. case Value::Kind::BindingWitness: {
  700. const auto& witness = cast<BindingWitness>(*this);
  701. out << "witness for " << *witness.binding()->type_var();
  702. break;
  703. }
  704. case Value::Kind::ConstraintWitness: {
  705. const auto& witness = cast<ConstraintWitness>(*this);
  706. out << "(";
  707. llvm::ListSeparator sep;
  708. for (const auto* elem : witness.witnesses()) {
  709. out << sep << *elem;
  710. }
  711. out << ")";
  712. break;
  713. }
  714. case Value::Kind::ConstraintImplWitness: {
  715. const auto& witness = cast<ConstraintImplWitness>(*this);
  716. out << "witness " << witness.index() << " of "
  717. << *witness.constraint_witness();
  718. break;
  719. }
  720. case Value::Kind::ParameterizedEntityName:
  721. out << *GetName(cast<ParameterizedEntityName>(*this).declaration());
  722. break;
  723. case Value::Kind::MemberName: {
  724. const auto& member_name = cast<MemberName>(*this);
  725. if (member_name.base_type().has_value()) {
  726. out << *member_name.base_type().value();
  727. }
  728. if (member_name.base_type().has_value() &&
  729. member_name.interface().has_value()) {
  730. out << "(";
  731. }
  732. if (member_name.interface().has_value()) {
  733. out << *member_name.interface().value();
  734. }
  735. out << "." << member_name;
  736. if (member_name.base_type().has_value() &&
  737. member_name.interface().has_value()) {
  738. out << ")";
  739. }
  740. break;
  741. }
  742. case Value::Kind::VariableType:
  743. out << cast<VariableType>(*this).binding().name();
  744. break;
  745. case Value::Kind::AssociatedConstant: {
  746. const auto& assoc = cast<AssociatedConstant>(*this);
  747. out << "(" << assoc.base() << ").(";
  748. PrintNameWithBindings(out, &assoc.interface().declaration(),
  749. assoc.interface().args());
  750. out << "." << *GetName(assoc.constant()) << ")";
  751. break;
  752. }
  753. case Value::Kind::StringType:
  754. out << "String";
  755. break;
  756. case Value::Kind::StringValue:
  757. out << "\"";
  758. out.write_escaped(cast<StringValue>(*this).value());
  759. out << "\"";
  760. break;
  761. case Value::Kind::TypeOfMixinPseudoType:
  762. out << "typeof("
  763. << cast<TypeOfMixinPseudoType>(*this)
  764. .mixin_type()
  765. .declaration()
  766. .name()
  767. << ")";
  768. break;
  769. case Value::Kind::TypeOfParameterizedEntityName:
  770. out << "parameterized entity name "
  771. << cast<TypeOfParameterizedEntityName>(*this).name();
  772. break;
  773. case Value::Kind::TypeOfMemberName: {
  774. out << "member name " << cast<TypeOfMemberName>(*this).member();
  775. break;
  776. }
  777. case Value::Kind::TypeOfNamespaceName: {
  778. cast<TypeOfNamespaceName>(*this).namespace_decl()->PrintID(out);
  779. break;
  780. }
  781. case Value::Kind::StaticArrayType: {
  782. const auto& array_type = cast<StaticArrayType>(*this);
  783. out << "[" << array_type.element_type() << ";";
  784. if (array_type.has_size()) {
  785. out << " " << array_type.size();
  786. }
  787. out << "]";
  788. break;
  789. }
  790. }
  791. }
  792. void IntrinsicConstraint::Print(llvm::raw_ostream& out) const {
  793. out << *type << " is ";
  794. switch (kind) {
  795. case IntrinsicConstraint::ImplicitAs:
  796. out << "__intrinsic_implicit_as";
  797. break;
  798. }
  799. if (!arguments.empty()) {
  800. out << "(";
  801. llvm::ListSeparator comma;
  802. for (Nonnull<const Value*> argument : arguments) {
  803. out << comma << *argument;
  804. }
  805. out << ")";
  806. }
  807. }
  808. // Check whether two binding maps, which are assumed to have the same keys, are
  809. // equal.
  810. static auto BindingMapEqual(
  811. const BindingMap& map1, const BindingMap& map2,
  812. std::optional<Nonnull<const EqualityContext*>> equality_ctx) -> bool {
  813. CARBON_CHECK(map1.size() == map2.size()) << "maps should have same keys";
  814. for (const auto& [key, value] : map1) {
  815. if (!ValueEqual(value, map2.at(key), equality_ctx)) {
  816. return false;
  817. }
  818. }
  819. return true;
  820. }
  821. auto TypeEqual(Nonnull<const Value*> t1, Nonnull<const Value*> t2,
  822. std::optional<Nonnull<const EqualityContext*>> equality_ctx)
  823. -> bool {
  824. if (t1 == t2) {
  825. return true;
  826. }
  827. if (t1->kind() != t2->kind()) {
  828. if (IsValueKindDependent(t1) || IsValueKindDependent(t2)) {
  829. return ValueEqual(t1, t2, equality_ctx);
  830. }
  831. return false;
  832. }
  833. switch (t1->kind()) {
  834. case Value::Kind::PointerType:
  835. return TypeEqual(&cast<PointerType>(*t1).pointee_type(),
  836. &cast<PointerType>(*t2).pointee_type(), equality_ctx);
  837. case Value::Kind::FunctionType: {
  838. const auto& fn1 = cast<FunctionType>(*t1);
  839. const auto& fn2 = cast<FunctionType>(*t2);
  840. // Verify `self` parameters match
  841. auto self1 = fn1.method_self();
  842. auto self2 = fn2.method_self();
  843. if (self1.has_value() != self2.has_value()) {
  844. return false;
  845. }
  846. if (self1) {
  847. if (self1->addr_self != self2->addr_self ||
  848. !TypeEqual(self1->self_type, self2->self_type, equality_ctx)) {
  849. return false;
  850. }
  851. }
  852. // Verify parameters and return types match
  853. return TypeEqual(&fn1.parameters(), &fn2.parameters(), equality_ctx) &&
  854. TypeEqual(&fn1.return_type(), &fn2.return_type(), equality_ctx);
  855. }
  856. case Value::Kind::StructType: {
  857. const auto& struct1 = cast<StructType>(*t1);
  858. const auto& struct2 = cast<StructType>(*t2);
  859. if (struct1.fields().size() != struct2.fields().size()) {
  860. return false;
  861. }
  862. for (size_t i = 0; i < struct1.fields().size(); ++i) {
  863. if (struct1.fields()[i].name != struct2.fields()[i].name ||
  864. !TypeEqual(struct1.fields()[i].value, struct2.fields()[i].value,
  865. equality_ctx)) {
  866. return false;
  867. }
  868. }
  869. return true;
  870. }
  871. case Value::Kind::NominalClassType: {
  872. const auto& class1 = cast<NominalClassType>(*t1);
  873. const auto& class2 = cast<NominalClassType>(*t2);
  874. return DeclaresSameEntity(class1.declaration(), class2.declaration()) &&
  875. BindingMapEqual(class1.bindings().args(), class2.bindings().args(),
  876. equality_ctx);
  877. }
  878. case Value::Kind::InterfaceType: {
  879. const auto& iface1 = cast<InterfaceType>(*t1);
  880. const auto& iface2 = cast<InterfaceType>(*t2);
  881. return DeclaresSameEntity(iface1.declaration(), iface2.declaration()) &&
  882. BindingMapEqual(iface1.bindings().args(), iface2.bindings().args(),
  883. equality_ctx);
  884. }
  885. case Value::Kind::NamedConstraintType: {
  886. const auto& constraint1 = cast<NamedConstraintType>(*t1);
  887. const auto& constraint2 = cast<NamedConstraintType>(*t2);
  888. return DeclaresSameEntity(constraint1.declaration(),
  889. constraint2.declaration()) &&
  890. BindingMapEqual(constraint1.bindings().args(),
  891. constraint2.bindings().args(), equality_ctx);
  892. }
  893. case Value::Kind::AssociatedConstant:
  894. // Associated constants are sometimes types.
  895. return ValueEqual(t1, t2, equality_ctx);
  896. case Value::Kind::ConstraintType: {
  897. const auto& constraint1 = cast<ConstraintType>(*t1);
  898. const auto& constraint2 = cast<ConstraintType>(*t2);
  899. if (constraint1.impls_constraints().size() !=
  900. constraint2.impls_constraints().size() ||
  901. constraint1.equality_constraints().size() !=
  902. constraint2.equality_constraints().size() ||
  903. constraint1.lookup_contexts().size() !=
  904. constraint2.lookup_contexts().size()) {
  905. return false;
  906. }
  907. for (size_t i = 0; i < constraint1.impls_constraints().size(); ++i) {
  908. const auto& impl1 = constraint1.impls_constraints()[i];
  909. const auto& impl2 = constraint2.impls_constraints()[i];
  910. if (!TypeEqual(impl1.type, impl2.type, equality_ctx) ||
  911. !TypeEqual(impl1.interface, impl2.interface, equality_ctx)) {
  912. return false;
  913. }
  914. }
  915. for (size_t i = 0; i < constraint1.equality_constraints().size(); ++i) {
  916. const auto& equality1 = constraint1.equality_constraints()[i];
  917. const auto& equality2 = constraint2.equality_constraints()[i];
  918. if (equality1.values.size() != equality2.values.size()) {
  919. return false;
  920. }
  921. for (size_t j = 0; j < equality1.values.size(); ++j) {
  922. if (!ValueEqual(equality1.values[j], equality2.values[j],
  923. equality_ctx)) {
  924. return false;
  925. }
  926. }
  927. }
  928. for (size_t i = 0; i < constraint1.lookup_contexts().size(); ++i) {
  929. const auto& context1 = constraint1.lookup_contexts()[i];
  930. const auto& context2 = constraint2.lookup_contexts()[i];
  931. if (!TypeEqual(context1.context, context2.context, equality_ctx)) {
  932. return false;
  933. }
  934. }
  935. return true;
  936. }
  937. case Value::Kind::ChoiceType: {
  938. const auto& choice1 = cast<ChoiceType>(*t1);
  939. const auto& choice2 = cast<ChoiceType>(*t2);
  940. return DeclaresSameEntity(choice1.declaration(), choice2.declaration()) &&
  941. BindingMapEqual(choice1.type_args(), choice2.type_args(),
  942. equality_ctx);
  943. }
  944. case Value::Kind::TupleType:
  945. case Value::Kind::TupleValue: {
  946. const auto& tup1 = cast<TupleValueBase>(*t1);
  947. const auto& tup2 = cast<TupleValueBase>(*t2);
  948. if (tup1.elements().size() != tup2.elements().size()) {
  949. return false;
  950. }
  951. for (size_t i = 0; i < tup1.elements().size(); ++i) {
  952. if (!TypeEqual(tup1.elements()[i], tup2.elements()[i], equality_ctx)) {
  953. return false;
  954. }
  955. }
  956. return true;
  957. }
  958. case Value::Kind::IntType:
  959. case Value::Kind::BoolType:
  960. case Value::Kind::TypeType:
  961. case Value::Kind::StringType:
  962. return true;
  963. case Value::Kind::VariableType:
  964. return &cast<VariableType>(*t1).binding() ==
  965. &cast<VariableType>(*t2).binding();
  966. case Value::Kind::StaticArrayType: {
  967. const auto& array1 = cast<StaticArrayType>(*t1);
  968. const auto& array2 = cast<StaticArrayType>(*t2);
  969. return TypeEqual(&array1.element_type(), &array2.element_type(),
  970. equality_ctx) &&
  971. array1.size() == array2.size();
  972. }
  973. case Value::Kind::IntValue:
  974. case Value::Kind::BoolValue:
  975. case Value::Kind::DestructorValue:
  976. case Value::Kind::FunctionValue:
  977. case Value::Kind::BoundMethodValue:
  978. case Value::Kind::StructValue:
  979. case Value::Kind::NominalClassValue:
  980. case Value::Kind::AlternativeValue:
  981. case Value::Kind::AlternativeConstructorValue:
  982. case Value::Kind::StringValue:
  983. case Value::Kind::PointerValue:
  984. case Value::Kind::LocationValue:
  985. case Value::Kind::ReferenceExpressionValue:
  986. case Value::Kind::BindingPlaceholderValue:
  987. case Value::Kind::AddrValue:
  988. case Value::Kind::UninitializedValue:
  989. case Value::Kind::ParameterizedEntityName:
  990. case Value::Kind::MemberName:
  991. case Value::Kind::TypeOfParameterizedEntityName:
  992. case Value::Kind::TypeOfMemberName:
  993. case Value::Kind::MixinPseudoType:
  994. case Value::Kind::TypeOfMixinPseudoType:
  995. case Value::Kind::TypeOfNamespaceName:
  996. CARBON_FATAL() << "TypeEqual used to compare non-type values\n"
  997. << *t1 << "\n"
  998. << *t2;
  999. case Value::Kind::ImplWitness:
  1000. case Value::Kind::BindingWitness:
  1001. case Value::Kind::ConstraintWitness:
  1002. case Value::Kind::ConstraintImplWitness:
  1003. CARBON_FATAL() << "TypeEqual: unexpected Witness";
  1004. break;
  1005. case Value::Kind::AutoType:
  1006. CARBON_FATAL() << "TypeEqual: unexpected AutoType";
  1007. break;
  1008. }
  1009. }
  1010. // Returns true if the two values are known to be equal and are written in the
  1011. // same way at the top level.
  1012. auto ValueStructurallyEqual(
  1013. Nonnull<const Value*> v1, Nonnull<const Value*> v2,
  1014. std::optional<Nonnull<const EqualityContext*>> equality_ctx) -> bool {
  1015. if (v1 == v2) {
  1016. return true;
  1017. }
  1018. if (v1->kind() != v2->kind()) {
  1019. return false;
  1020. }
  1021. switch (v1->kind()) {
  1022. case Value::Kind::IntValue:
  1023. return cast<IntValue>(*v1).value() == cast<IntValue>(*v2).value();
  1024. case Value::Kind::BoolValue:
  1025. return cast<BoolValue>(*v1).value() == cast<BoolValue>(*v2).value();
  1026. case Value::Kind::FunctionValue: {
  1027. std::optional<Nonnull<const Statement*>> body1 =
  1028. cast<FunctionValue>(*v1).declaration().body();
  1029. std::optional<Nonnull<const Statement*>> body2 =
  1030. cast<FunctionValue>(*v2).declaration().body();
  1031. return body1.has_value() == body2.has_value() &&
  1032. (!body1.has_value() || *body1 == *body2);
  1033. }
  1034. case Value::Kind::DestructorValue:
  1035. return false;
  1036. case Value::Kind::BoundMethodValue: {
  1037. const auto& m1 = cast<BoundMethodValue>(*v1);
  1038. const auto& m2 = cast<BoundMethodValue>(*v2);
  1039. std::optional<Nonnull<const Statement*>> body1 = m1.declaration().body();
  1040. std::optional<Nonnull<const Statement*>> body2 = m2.declaration().body();
  1041. return ValueEqual(m1.receiver(), m2.receiver(), equality_ctx) &&
  1042. body1.has_value() == body2.has_value() &&
  1043. (!body1.has_value() || *body1 == *body2);
  1044. }
  1045. case Value::Kind::TupleType:
  1046. case Value::Kind::TupleValue: {
  1047. const std::vector<Nonnull<const Value*>>& elements1 =
  1048. cast<TupleValueBase>(*v1).elements();
  1049. const std::vector<Nonnull<const Value*>>& elements2 =
  1050. cast<TupleValueBase>(*v2).elements();
  1051. if (elements1.size() != elements2.size()) {
  1052. return false;
  1053. }
  1054. for (size_t i = 0; i < elements1.size(); ++i) {
  1055. if (!ValueEqual(elements1[i], elements2[i], equality_ctx)) {
  1056. return false;
  1057. }
  1058. }
  1059. return true;
  1060. }
  1061. case Value::Kind::StructValue: {
  1062. const auto& struct_v1 = cast<StructValue>(*v1);
  1063. const auto& struct_v2 = cast<StructValue>(*v2);
  1064. CARBON_CHECK(struct_v1.elements().size() == struct_v2.elements().size());
  1065. for (size_t i = 0; i < struct_v1.elements().size(); ++i) {
  1066. CARBON_CHECK(struct_v1.elements()[i].name ==
  1067. struct_v2.elements()[i].name);
  1068. if (!ValueEqual(struct_v1.elements()[i].value,
  1069. struct_v2.elements()[i].value, equality_ctx)) {
  1070. return false;
  1071. }
  1072. }
  1073. return true;
  1074. }
  1075. case Value::Kind::AlternativeValue: {
  1076. const auto& alt1 = cast<AlternativeValue>(*v1);
  1077. const auto& alt2 = cast<AlternativeValue>(*v2);
  1078. if (!TypeEqual(&alt1.choice(), &alt2.choice(), equality_ctx) ||
  1079. &alt1.alternative() != &alt2.alternative()) {
  1080. return false;
  1081. }
  1082. CARBON_CHECK(alt1.argument().has_value() == alt2.argument().has_value());
  1083. return !alt1.argument().has_value() ||
  1084. ValueEqual(*alt1.argument(), *alt2.argument(), equality_ctx);
  1085. }
  1086. case Value::Kind::StringValue:
  1087. return cast<StringValue>(*v1).value() == cast<StringValue>(*v2).value();
  1088. case Value::Kind::ParameterizedEntityName: {
  1089. std::optional<std::string_view> name1 =
  1090. GetName(cast<ParameterizedEntityName>(v1)->declaration());
  1091. std::optional<std::string_view> name2 =
  1092. GetName(cast<ParameterizedEntityName>(v2)->declaration());
  1093. CARBON_CHECK(name1.has_value() && name2.has_value())
  1094. << "parameterized name refers to unnamed declaration";
  1095. return *name1 == *name2;
  1096. }
  1097. case Value::Kind::AssociatedConstant: {
  1098. // The witness value is not part of determining value equality.
  1099. const auto& assoc1 = cast<AssociatedConstant>(*v1);
  1100. const auto& assoc2 = cast<AssociatedConstant>(*v2);
  1101. return DeclaresSameEntity(assoc1.constant(), assoc2.constant()) &&
  1102. TypeEqual(&assoc1.base(), &assoc2.base(), equality_ctx) &&
  1103. TypeEqual(&assoc1.interface(), &assoc2.interface(), equality_ctx);
  1104. }
  1105. case Value::Kind::IntType:
  1106. case Value::Kind::BoolType:
  1107. case Value::Kind::TypeType:
  1108. case Value::Kind::FunctionType:
  1109. case Value::Kind::PointerType:
  1110. case Value::Kind::AutoType:
  1111. case Value::Kind::StructType:
  1112. case Value::Kind::NominalClassType:
  1113. case Value::Kind::MixinPseudoType:
  1114. case Value::Kind::InterfaceType:
  1115. case Value::Kind::NamedConstraintType:
  1116. case Value::Kind::ConstraintType:
  1117. case Value::Kind::ImplWitness:
  1118. case Value::Kind::BindingWitness:
  1119. case Value::Kind::ConstraintWitness:
  1120. case Value::Kind::ConstraintImplWitness:
  1121. case Value::Kind::ChoiceType:
  1122. case Value::Kind::VariableType:
  1123. case Value::Kind::StringType:
  1124. case Value::Kind::TypeOfMixinPseudoType:
  1125. case Value::Kind::TypeOfParameterizedEntityName:
  1126. case Value::Kind::TypeOfMemberName:
  1127. case Value::Kind::TypeOfNamespaceName:
  1128. case Value::Kind::StaticArrayType:
  1129. return TypeEqual(v1, v2, equality_ctx);
  1130. case Value::Kind::NominalClassValue:
  1131. case Value::Kind::BindingPlaceholderValue:
  1132. case Value::Kind::AddrValue:
  1133. case Value::Kind::AlternativeConstructorValue:
  1134. case Value::Kind::PointerValue:
  1135. case Value::Kind::LocationValue:
  1136. case Value::Kind::ReferenceExpressionValue:
  1137. case Value::Kind::UninitializedValue:
  1138. case Value::Kind::MemberName:
  1139. // TODO: support pointer comparisons once we have a clearer distinction
  1140. // between pointers and lvalues.
  1141. CARBON_FATAL() << "ValueEqual does not support this kind of value: "
  1142. << *v1;
  1143. }
  1144. }
  1145. // Returns true if the two values are equal and returns false otherwise.
  1146. //
  1147. // This function implements the `==` operator of Carbon.
  1148. auto ValueEqual(Nonnull<const Value*> v1, Nonnull<const Value*> v2,
  1149. std::optional<Nonnull<const EqualityContext*>> equality_ctx)
  1150. -> bool {
  1151. if (v1 == v2) {
  1152. return true;
  1153. }
  1154. // If we're given an equality context, check to see if it knows these values
  1155. // are equal. Only perform the check if one or the other value is an
  1156. // associated constant; otherwise we should be able to do better by looking
  1157. // at the structures of the values.
  1158. if (equality_ctx) {
  1159. if (IsValueKindDependent(v1)) {
  1160. auto visitor = [&](Nonnull<const Value*> maybe_v2) {
  1161. return !ValueStructurallyEqual(v2, maybe_v2, equality_ctx);
  1162. };
  1163. if (!(*equality_ctx)->VisitEqualValues(v1, visitor)) {
  1164. return true;
  1165. }
  1166. }
  1167. if (IsValueKindDependent(v2)) {
  1168. auto visitor = [&](Nonnull<const Value*> maybe_v1) {
  1169. return !ValueStructurallyEqual(v1, maybe_v1, equality_ctx);
  1170. };
  1171. if (!(*equality_ctx)->VisitEqualValues(v2, visitor)) {
  1172. return true;
  1173. }
  1174. }
  1175. }
  1176. return ValueStructurallyEqual(v1, v2, equality_ctx);
  1177. }
  1178. auto EqualityConstraint::VisitEqualValues(
  1179. Nonnull<const Value*> value,
  1180. llvm::function_ref<bool(Nonnull<const Value*>)> visitor) const -> bool {
  1181. // See if the given value is part of this constraint.
  1182. auto first_equal = llvm::find_if(values, [value](Nonnull<const Value*> val) {
  1183. return ValueEqual(value, val, std::nullopt);
  1184. });
  1185. if (first_equal == values.end()) {
  1186. return true;
  1187. }
  1188. // The value is in this group; pass all non-identical values in the group
  1189. // to the visitor. First visit the values we already compared.
  1190. for (const auto* val : llvm::make_range(values.begin(), first_equal)) {
  1191. if (!visitor(val)) {
  1192. return false;
  1193. }
  1194. }
  1195. // Then visit any remaining non-identical values, skipping the one we already
  1196. // found was identical.
  1197. ++first_equal;
  1198. for (const auto* val : llvm::make_range(first_equal, values.end())) {
  1199. if (!ValueEqual(value, val, std::nullopt) && !visitor(val)) {
  1200. return false;
  1201. }
  1202. }
  1203. return true;
  1204. }
  1205. auto ConstraintType::VisitEqualValues(
  1206. Nonnull<const Value*> value,
  1207. llvm::function_ref<bool(Nonnull<const Value*>)> visitor) const -> bool {
  1208. for (const auto& eq : equality_constraints()) {
  1209. if (!eq.VisitEqualValues(value, visitor)) {
  1210. return false;
  1211. }
  1212. }
  1213. return true;
  1214. }
  1215. auto FindFunction(std::string_view name,
  1216. llvm::ArrayRef<Nonnull<Declaration*>> members)
  1217. -> std::optional<Nonnull<const FunctionValue*>> {
  1218. for (const auto& member : members) {
  1219. switch (member->kind()) {
  1220. case DeclarationKind::MixDeclaration: {
  1221. const auto& mix_decl = cast<MixDeclaration>(*member);
  1222. Nonnull<const MixinPseudoType*> mixin = &mix_decl.mixin_value();
  1223. const auto res = mixin->FindFunction(name);
  1224. if (res.has_value()) {
  1225. return res;
  1226. }
  1227. break;
  1228. }
  1229. case DeclarationKind::FunctionDeclaration: {
  1230. const auto& fun = cast<FunctionDeclaration>(*member);
  1231. if (fun.name().inner_name() == name) {
  1232. return &cast<FunctionValue>(**fun.constant_value());
  1233. }
  1234. break;
  1235. }
  1236. default:
  1237. break;
  1238. }
  1239. }
  1240. return std::nullopt;
  1241. }
  1242. // TODO: Find out a way to remove code duplication
  1243. auto MixinPseudoType::FindFunction(const std::string_view& name) const
  1244. -> std::optional<Nonnull<const FunctionValue*>> {
  1245. for (const auto& member : declaration().members()) {
  1246. switch (member->kind()) {
  1247. case DeclarationKind::MixDeclaration: {
  1248. const auto& mix_decl = cast<MixDeclaration>(*member);
  1249. Nonnull<const MixinPseudoType*> mixin = &mix_decl.mixin_value();
  1250. const auto res = mixin->FindFunction(name);
  1251. if (res.has_value()) {
  1252. return res;
  1253. }
  1254. break;
  1255. }
  1256. case DeclarationKind::FunctionDeclaration: {
  1257. const auto& fun = cast<FunctionDeclaration>(*member);
  1258. if (fun.name().inner_name() == name) {
  1259. return &cast<FunctionValue>(**fun.constant_value());
  1260. }
  1261. break;
  1262. }
  1263. default:
  1264. break;
  1265. }
  1266. }
  1267. return std::nullopt;
  1268. }
  1269. auto FindFunctionWithParents(std::string_view name,
  1270. const ClassDeclaration& class_decl)
  1271. -> std::optional<Nonnull<const FunctionValue*>> {
  1272. if (auto fun = FindFunction(name, class_decl.members()); fun.has_value()) {
  1273. return fun;
  1274. }
  1275. if (const auto base_type = class_decl.base_type(); base_type.has_value()) {
  1276. return FindFunctionWithParents(name, base_type.value()->declaration());
  1277. }
  1278. return std::nullopt;
  1279. }
  1280. auto FindMember(std::string_view name,
  1281. llvm::ArrayRef<Nonnull<Declaration*>> members)
  1282. -> std::optional<Nonnull<const Declaration*>> {
  1283. for (Nonnull<const Declaration*> member : members) {
  1284. if (std::optional<std::string_view> mem_name = GetName(*member);
  1285. mem_name.has_value()) {
  1286. if (*mem_name == name) {
  1287. return member;
  1288. }
  1289. }
  1290. }
  1291. return std::nullopt;
  1292. }
  1293. void ImplBinding::Print(llvm::raw_ostream& out) const {
  1294. out << "impl binding " << *type_var_ << " as " << **iface_;
  1295. }
  1296. void ImplBinding::PrintID(llvm::raw_ostream& out) const {
  1297. out << *type_var_ << " as " << **iface_;
  1298. }
  1299. auto NominalClassType::InheritsClass(Nonnull<const Value*> other) const
  1300. -> bool {
  1301. const auto* other_class = dyn_cast<NominalClassType>(other);
  1302. if (!other_class) {
  1303. return false;
  1304. }
  1305. std::optional<Nonnull<const NominalClassType*>> ancestor_class = this;
  1306. while (ancestor_class) {
  1307. if (TypeEqual(*ancestor_class, other_class, std::nullopt)) {
  1308. return true;
  1309. }
  1310. ancestor_class = (*ancestor_class)->base();
  1311. }
  1312. return false;
  1313. }
  1314. auto ExpressionCategoryToString(ExpressionCategory cat) -> llvm::StringRef {
  1315. switch (cat) {
  1316. case ExpressionCategory::Value:
  1317. return "value";
  1318. case ExpressionCategory::Reference:
  1319. return "reference";
  1320. case ExpressionCategory::Initializing:
  1321. return "initializing";
  1322. }
  1323. }
  1324. } // namespace Carbon