value.cpp 49 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370
  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 {0}", *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(
  382. (*path_begin).element()->kind() == 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 {0}", *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.member();
  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{0}\n{1}", *t1,
  997. *t2);
  998. case Value::Kind::ImplWitness:
  999. case Value::Kind::BindingWitness:
  1000. case Value::Kind::ConstraintWitness:
  1001. case Value::Kind::ConstraintImplWitness:
  1002. CARBON_FATAL("TypeEqual: unexpected Witness");
  1003. break;
  1004. case Value::Kind::AutoType:
  1005. CARBON_FATAL("TypeEqual: unexpected AutoType");
  1006. break;
  1007. }
  1008. }
  1009. // Returns true if the two values are known to be equal and are written in the
  1010. // same way at the top level.
  1011. static auto ValueStructurallyEqual(
  1012. Nonnull<const Value*> v1, Nonnull<const Value*> v2,
  1013. std::optional<Nonnull<const EqualityContext*>> equality_ctx) -> bool {
  1014. if (v1 == v2) {
  1015. return true;
  1016. }
  1017. if (v1->kind() != v2->kind()) {
  1018. return false;
  1019. }
  1020. switch (v1->kind()) {
  1021. case Value::Kind::IntValue:
  1022. return cast<IntValue>(*v1).value() == cast<IntValue>(*v2).value();
  1023. case Value::Kind::BoolValue:
  1024. return cast<BoolValue>(*v1).value() == cast<BoolValue>(*v2).value();
  1025. case Value::Kind::FunctionValue: {
  1026. std::optional<Nonnull<const Statement*>> body1 =
  1027. cast<FunctionValue>(*v1).declaration().body();
  1028. std::optional<Nonnull<const Statement*>> body2 =
  1029. cast<FunctionValue>(*v2).declaration().body();
  1030. return body1.has_value() == body2.has_value() &&
  1031. (!body1.has_value() || *body1 == *body2);
  1032. }
  1033. case Value::Kind::DestructorValue:
  1034. return false;
  1035. case Value::Kind::BoundMethodValue: {
  1036. const auto& m1 = cast<BoundMethodValue>(*v1);
  1037. const auto& m2 = cast<BoundMethodValue>(*v2);
  1038. std::optional<Nonnull<const Statement*>> body1 = m1.declaration().body();
  1039. std::optional<Nonnull<const Statement*>> body2 = m2.declaration().body();
  1040. return ValueEqual(m1.receiver(), m2.receiver(), equality_ctx) &&
  1041. body1.has_value() == body2.has_value() &&
  1042. (!body1.has_value() || *body1 == *body2);
  1043. }
  1044. case Value::Kind::TupleType:
  1045. case Value::Kind::TupleValue: {
  1046. const std::vector<Nonnull<const Value*>>& elements1 =
  1047. cast<TupleValueBase>(*v1).elements();
  1048. const std::vector<Nonnull<const Value*>>& elements2 =
  1049. cast<TupleValueBase>(*v2).elements();
  1050. if (elements1.size() != elements2.size()) {
  1051. return false;
  1052. }
  1053. for (size_t i = 0; i < elements1.size(); ++i) {
  1054. if (!ValueEqual(elements1[i], elements2[i], equality_ctx)) {
  1055. return false;
  1056. }
  1057. }
  1058. return true;
  1059. }
  1060. case Value::Kind::StructValue: {
  1061. const auto& struct_v1 = cast<StructValue>(*v1);
  1062. const auto& struct_v2 = cast<StructValue>(*v2);
  1063. CARBON_CHECK(struct_v1.elements().size() == struct_v2.elements().size());
  1064. for (size_t i = 0; i < struct_v1.elements().size(); ++i) {
  1065. CARBON_CHECK(struct_v1.elements()[i].name ==
  1066. struct_v2.elements()[i].name);
  1067. if (!ValueEqual(struct_v1.elements()[i].value,
  1068. struct_v2.elements()[i].value, equality_ctx)) {
  1069. return false;
  1070. }
  1071. }
  1072. return true;
  1073. }
  1074. case Value::Kind::AlternativeValue: {
  1075. const auto& alt1 = cast<AlternativeValue>(*v1);
  1076. const auto& alt2 = cast<AlternativeValue>(*v2);
  1077. if (!TypeEqual(&alt1.choice(), &alt2.choice(), equality_ctx) ||
  1078. &alt1.alternative() != &alt2.alternative()) {
  1079. return false;
  1080. }
  1081. CARBON_CHECK(alt1.argument().has_value() == alt2.argument().has_value());
  1082. return !alt1.argument().has_value() ||
  1083. ValueEqual(*alt1.argument(), *alt2.argument(), equality_ctx);
  1084. }
  1085. case Value::Kind::StringValue:
  1086. return cast<StringValue>(*v1).value() == cast<StringValue>(*v2).value();
  1087. case Value::Kind::ParameterizedEntityName: {
  1088. std::optional<std::string_view> name1 =
  1089. GetName(cast<ParameterizedEntityName>(v1)->declaration());
  1090. std::optional<std::string_view> name2 =
  1091. GetName(cast<ParameterizedEntityName>(v2)->declaration());
  1092. CARBON_CHECK(name1.has_value() && name2.has_value(),
  1093. "parameterized name refers to unnamed declaration");
  1094. return *name1 == *name2;
  1095. }
  1096. case Value::Kind::AssociatedConstant: {
  1097. // The witness value is not part of determining value equality.
  1098. const auto& assoc1 = cast<AssociatedConstant>(*v1);
  1099. const auto& assoc2 = cast<AssociatedConstant>(*v2);
  1100. return DeclaresSameEntity(assoc1.constant(), assoc2.constant()) &&
  1101. TypeEqual(&assoc1.base(), &assoc2.base(), equality_ctx) &&
  1102. TypeEqual(&assoc1.interface(), &assoc2.interface(), equality_ctx);
  1103. }
  1104. case Value::Kind::IntType:
  1105. case Value::Kind::BoolType:
  1106. case Value::Kind::TypeType:
  1107. case Value::Kind::FunctionType:
  1108. case Value::Kind::PointerType:
  1109. case Value::Kind::AutoType:
  1110. case Value::Kind::StructType:
  1111. case Value::Kind::NominalClassType:
  1112. case Value::Kind::MixinPseudoType:
  1113. case Value::Kind::InterfaceType:
  1114. case Value::Kind::NamedConstraintType:
  1115. case Value::Kind::ConstraintType:
  1116. case Value::Kind::ImplWitness:
  1117. case Value::Kind::BindingWitness:
  1118. case Value::Kind::ConstraintWitness:
  1119. case Value::Kind::ConstraintImplWitness:
  1120. case Value::Kind::ChoiceType:
  1121. case Value::Kind::VariableType:
  1122. case Value::Kind::StringType:
  1123. case Value::Kind::TypeOfMixinPseudoType:
  1124. case Value::Kind::TypeOfParameterizedEntityName:
  1125. case Value::Kind::TypeOfMemberName:
  1126. case Value::Kind::TypeOfNamespaceName:
  1127. case Value::Kind::StaticArrayType:
  1128. return TypeEqual(v1, v2, equality_ctx);
  1129. case Value::Kind::NominalClassValue:
  1130. case Value::Kind::BindingPlaceholderValue:
  1131. case Value::Kind::AddrValue:
  1132. case Value::Kind::AlternativeConstructorValue:
  1133. case Value::Kind::PointerValue:
  1134. case Value::Kind::LocationValue:
  1135. case Value::Kind::ReferenceExpressionValue:
  1136. case Value::Kind::UninitializedValue:
  1137. case Value::Kind::MemberName:
  1138. // TODO: support pointer comparisons once we have a clearer distinction
  1139. // between pointers and lvalues.
  1140. CARBON_FATAL("ValueEqual does not support this kind of value: {0}", *v1);
  1141. }
  1142. }
  1143. // Returns true if the two values are equal and returns false otherwise.
  1144. //
  1145. // This function implements the `==` operator of Carbon.
  1146. auto ValueEqual(Nonnull<const Value*> v1, Nonnull<const Value*> v2,
  1147. std::optional<Nonnull<const EqualityContext*>> equality_ctx)
  1148. -> bool {
  1149. if (v1 == v2) {
  1150. return true;
  1151. }
  1152. // If we're given an equality context, check to see if it knows these values
  1153. // are equal. Only perform the check if one or the other value is an
  1154. // associated constant; otherwise we should be able to do better by looking
  1155. // at the structures of the values.
  1156. if (equality_ctx) {
  1157. if (IsValueKindDependent(v1)) {
  1158. auto visitor = [&](Nonnull<const Value*> maybe_v2) {
  1159. return !ValueStructurallyEqual(v2, maybe_v2, equality_ctx);
  1160. };
  1161. if (!(*equality_ctx)->VisitEqualValues(v1, visitor)) {
  1162. return true;
  1163. }
  1164. }
  1165. if (IsValueKindDependent(v2)) {
  1166. auto visitor = [&](Nonnull<const Value*> maybe_v1) {
  1167. return !ValueStructurallyEqual(v1, maybe_v1, equality_ctx);
  1168. };
  1169. if (!(*equality_ctx)->VisitEqualValues(v2, visitor)) {
  1170. return true;
  1171. }
  1172. }
  1173. }
  1174. return ValueStructurallyEqual(v1, v2, equality_ctx);
  1175. }
  1176. auto EqualityConstraint::VisitEqualValues(
  1177. Nonnull<const Value*> value,
  1178. llvm::function_ref<bool(Nonnull<const Value*>)> visitor) const -> bool {
  1179. // See if the given value is part of this constraint.
  1180. auto first_equal = llvm::find_if(values, [value](Nonnull<const Value*> val) {
  1181. return ValueEqual(value, val, std::nullopt);
  1182. });
  1183. if (first_equal == values.end()) {
  1184. return true;
  1185. }
  1186. // The value is in this group; pass all non-identical values in the group
  1187. // to the visitor. First visit the values we already compared.
  1188. for (const auto* val : llvm::make_range(values.begin(), first_equal)) {
  1189. if (!visitor(val)) {
  1190. return false;
  1191. }
  1192. }
  1193. // Then visit any remaining non-identical values, skipping the one we already
  1194. // found was identical.
  1195. ++first_equal;
  1196. for (const auto* val : llvm::make_range(first_equal, values.end())) {
  1197. if (!ValueEqual(value, val, std::nullopt) && !visitor(val)) {
  1198. return false;
  1199. }
  1200. }
  1201. return true;
  1202. }
  1203. auto ConstraintType::VisitEqualValues(
  1204. Nonnull<const Value*> value,
  1205. llvm::function_ref<bool(Nonnull<const Value*>)> visitor) const -> bool {
  1206. for (const auto& eq : equality_constraints()) {
  1207. if (!eq.VisitEqualValues(value, visitor)) {
  1208. return false;
  1209. }
  1210. }
  1211. return true;
  1212. }
  1213. auto FindFunction(std::string_view name,
  1214. llvm::ArrayRef<Nonnull<Declaration*>> members)
  1215. -> std::optional<Nonnull<const FunctionValue*>> {
  1216. for (const auto& member : members) {
  1217. switch (member->kind()) {
  1218. case DeclarationKind::MixDeclaration: {
  1219. const auto& mix_decl = cast<MixDeclaration>(*member);
  1220. Nonnull<const MixinPseudoType*> mixin = &mix_decl.mixin_value();
  1221. const auto res = mixin->FindFunction(name);
  1222. if (res.has_value()) {
  1223. return res;
  1224. }
  1225. break;
  1226. }
  1227. case DeclarationKind::FunctionDeclaration: {
  1228. const auto& fun = cast<FunctionDeclaration>(*member);
  1229. if (fun.name().inner_name() == name) {
  1230. return &cast<FunctionValue>(**fun.constant_value());
  1231. }
  1232. break;
  1233. }
  1234. default:
  1235. break;
  1236. }
  1237. }
  1238. return std::nullopt;
  1239. }
  1240. // TODO: Find out a way to remove code duplication
  1241. auto MixinPseudoType::FindFunction(const std::string_view& name) const
  1242. -> std::optional<Nonnull<const FunctionValue*>> {
  1243. for (const auto& member : declaration().members()) {
  1244. switch (member->kind()) {
  1245. case DeclarationKind::MixDeclaration: {
  1246. const auto& mix_decl = cast<MixDeclaration>(*member);
  1247. Nonnull<const MixinPseudoType*> mixin = &mix_decl.mixin_value();
  1248. const auto res = mixin->FindFunction(name);
  1249. if (res.has_value()) {
  1250. return res;
  1251. }
  1252. break;
  1253. }
  1254. case DeclarationKind::FunctionDeclaration: {
  1255. const auto& fun = cast<FunctionDeclaration>(*member);
  1256. if (fun.name().inner_name() == name) {
  1257. return &cast<FunctionValue>(**fun.constant_value());
  1258. }
  1259. break;
  1260. }
  1261. default:
  1262. break;
  1263. }
  1264. }
  1265. return std::nullopt;
  1266. }
  1267. auto FindFunctionWithParents(std::string_view name,
  1268. const ClassDeclaration& class_decl)
  1269. -> std::optional<Nonnull<const FunctionValue*>> {
  1270. if (auto fun = FindFunction(name, class_decl.members()); fun.has_value()) {
  1271. return fun;
  1272. }
  1273. if (const auto base_type = class_decl.base_type(); base_type.has_value()) {
  1274. return FindFunctionWithParents(name, base_type.value()->declaration());
  1275. }
  1276. return std::nullopt;
  1277. }
  1278. auto FindMember(std::string_view name,
  1279. llvm::ArrayRef<Nonnull<Declaration*>> members)
  1280. -> std::optional<Nonnull<const Declaration*>> {
  1281. for (Nonnull<const Declaration*> member : members) {
  1282. if (std::optional<std::string_view> mem_name = GetName(*member);
  1283. mem_name.has_value()) {
  1284. if (*mem_name == name) {
  1285. return member;
  1286. }
  1287. }
  1288. }
  1289. return std::nullopt;
  1290. }
  1291. void ImplBinding::Print(llvm::raw_ostream& out) const {
  1292. out << "impl binding " << *type_var_ << " as " << **iface_;
  1293. }
  1294. void ImplBinding::PrintID(llvm::raw_ostream& out) const {
  1295. out << *type_var_ << " as " << **iface_;
  1296. }
  1297. auto NominalClassType::InheritsClass(Nonnull<const Value*> other) const
  1298. -> bool {
  1299. const auto* other_class = dyn_cast<NominalClassType>(other);
  1300. if (!other_class) {
  1301. return false;
  1302. }
  1303. std::optional<Nonnull<const NominalClassType*>> ancestor_class = this;
  1304. while (ancestor_class) {
  1305. if (TypeEqual(*ancestor_class, other_class, std::nullopt)) {
  1306. return true;
  1307. }
  1308. ancestor_class = (*ancestor_class)->base();
  1309. }
  1310. return false;
  1311. }
  1312. auto ExpressionCategoryToString(ExpressionCategory cat) -> llvm::StringRef {
  1313. switch (cat) {
  1314. case ExpressionCategory::Value:
  1315. return "value";
  1316. case ExpressionCategory::Reference:
  1317. return "reference";
  1318. case ExpressionCategory::Initializing:
  1319. return "initializing";
  1320. }
  1321. }
  1322. } // namespace Carbon