<html><head></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><br><div><div>On Feb 9, 2010, at 4:28 PM, Talin wrote:</div><br class="Apple-interchange-newline"><blockquote type="cite">ping...<br></blockquote><div><br></div><div>Hi Talin, sorry for the delay.  FWIW, it's usually best to trickle pieces of a feature in and build it up over time, otherwise your patch just gets larger and larger.</div><div><br></div><div>LangRef.html:</div><div><br></div><div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 13px/normal Inconsolata; ">+  <dt><b>Union constants</b></dt></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 13px/normal Inconsolata; ">+  <dd>Union constants are represented with notation similar to a structure with</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 13px/normal Inconsolata; ">+      a single element - that is, a single typed element surrounded</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 13px/normal Inconsolata; ">+      by braces (<tt>{}</tt>)).  For example: "<tt>{ i32 4 }</tt>".  A</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 13px/normal Inconsolata; ">+      single-element constant struct can be implicitly converted to a</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 13px/normal Inconsolata; ">+      <a href="#t_union">union type</a> as long as the type of the struct</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 13px/normal Inconsolata; ">+      element matches the type of one of the union members.</dd></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 13px/normal Inconsolata; ">+</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 13px/normal Inconsolata; "><br></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 13px/normal Inconsolata; ">It's a minor point, but I'd avoid the term "implicitly converted".</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 13px/normal Inconsolata; "><br></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 13px/normal Inconsolata; ">Constants.cpp:</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 13px/normal Inconsolata; "><br></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 13px/normal Inconsolata; "><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 13px/normal Inconsolata; ">-  assert(Idx->getType()->isInteger(32) &&</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 13px/normal Inconsolata; ">+  assert(Idx->getType() == Type::getInt32Ty(Val->getContext()) &&</div><div><br></div></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 13px/normal Inconsolata; ">You're reverting these changes, please don't.  There are a couple instances of this.</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 13px/normal Inconsolata; "><br></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 13px/normal Inconsolata; "><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 13px/normal Inconsolata; ">+void ConstantUnion::replaceUsesOfWithOnConstant(Value *From, Value *To,</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 13px/normal Inconsolata; ">+                                                 Use *U) {</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 13px/normal Inconsolata; ">+  assert(false && "Implement replaceUsesOfWithOnConstant for unions");</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 13px/normal Inconsolata; ">+}</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 13px/normal Inconsolata; ">+</div><div><br></div><div>Still not implemented?</div></div></div><div><br></div><div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 13px/normal Inconsolata; ">+UnionType *UnionType::get(const Type *type, ...) {</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 13px/normal Inconsolata; ">+  va_list ap;</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 13px/normal Inconsolata; ">+  std::vector<const llvm::Type*> UnionFields;</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 13px/normal Inconsolata; ">+  va_start(ap, type);</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 13px/normal Inconsolata; "><br></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 13px/normal Inconsolata; ">Please use smallvector.</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 13px/normal Inconsolata; "><br></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 13px/normal Inconsolata; "><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 13px/normal Inconsolata; ">+bool UnionType::isValidElementType(const Type *ElemTy) {</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 13px/normal Inconsolata; ">+  return !ElemTy->isVoidTy() && !ElemTy->isLabelTy() &&</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 13px/normal Inconsolata; ">+         !ElemTy->isMetadataTy() && !isa<FunctionType>(ElemTy);</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 13px/normal Inconsolata; ">+}</div><div><br></div><div>Isn't there a better predicate somewhere?</div><div><br></div><div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 13px/normal Inconsolata; ">+LLVMTypeRef LLVMUnionTypeInContext(LLVMContextRef C, LLVMTypeRef *ElementTypes,</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 13px/normal Inconsolata; ">+                           unsigned ElementCount) {</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 13px/normal Inconsolata; ">+  std::vector<const Type*> Tys;</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 13px/normal Inconsolata; ">+  for (LLVMTypeRef *I = ElementTypes,</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 13px/normal Inconsolata; ">+</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 13px/normal Inconsolata; "><br></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 13px/normal Inconsolata; ">indentation of unsigned and use smallvector.</div></div></div></div><div><br></div><div><br></div><div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 13px/normal Inconsolata; ">+/// ParseUnionType</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 13px/normal Inconsolata; ">+///   TypeRec</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 13px/normal Inconsolata; ">+///     ::= 'union' '{' '}'</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 13px/normal Inconsolata; ">+///     ::= 'union' '{' TypeRec (',' TypeRec)* '}'</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 13px/normal Inconsolata; ">+bool LLParser::ParseUnionType(PATypeHolder &Result) {</div><div><font class="Apple-style-span" face="Inconsolata" size="3"><span class="Apple-style-span" style="font-size: 13px;"><br></span></font></div><div><font class="Apple-style-span" face="Inconsolata" size="3"><span class="Apple-style-span" style="font-size: 13px;">Unions can't be empty, so the first grammar production isn't valid.</span></font></div><div><font class="Apple-style-span" face="Inconsolata" size="3"><span class="Apple-style-span" style="font-size: 13px;"><br></span></font></div><div><font class="Apple-style-span" face="Inconsolata" size="3"><span class="Apple-style-span" style="font-size: 13px;">Otherwise, it looks good, please send these updates and I will commit it for you.</span></font></div><div><font class="Apple-style-span" face="Inconsolata" size="3"><span class="Apple-style-span" style="font-size: 13px;"><br></span></font></div><div><font class="Apple-style-span" face="Inconsolata" size="3"><span class="Apple-style-span" style="font-size: 13px;">-Chris</span></font></div><div><font class="Apple-style-span" face="Inconsolata" size="3"><span class="Apple-style-span" style="font-size: 13px;"><br></span></font></div></div></div></body></html>