<html>
    <head>
      <base href="https://bugs.llvm.org/">
    </head>
    <body><table border="1" cellspacing="0" cellpadding="8">
        <tr>
          <th>Bug ID</th>
          <td><a class="bz_bug_link 
          bz_status_NEW "
   title="NEW - Wrong resolving boost::variant template arguments by formatters API"
   href="https://bugs.llvm.org/show_bug.cgi?id=32300">32300</a>
          </td>
        </tr>

        <tr>
          <th>Summary</th>
          <td>Wrong resolving boost::variant template arguments by formatters API
          </td>
        </tr>

        <tr>
          <th>Product</th>
          <td>lldb
          </td>
        </tr>

        <tr>
          <th>Version</th>
          <td>3.9
          </td>
        </tr>

        <tr>
          <th>Hardware</th>
          <td>Macintosh
          </td>
        </tr>

        <tr>
          <th>OS</th>
          <td>MacOS X
          </td>
        </tr>

        <tr>
          <th>Status</th>
          <td>NEW
          </td>
        </tr>

        <tr>
          <th>Severity</th>
          <td>normal
          </td>
        </tr>

        <tr>
          <th>Priority</th>
          <td>P
          </td>
        </tr>

        <tr>
          <th>Component</th>
          <td>All Bugs
          </td>
        </tr>

        <tr>
          <th>Assignee</th>
          <td>lldb-dev@lists.llvm.org
          </td>
        </tr>

        <tr>
          <th>Reporter</th>
          <td>andrew.stepanov.i@gmail.com
          </td>
        </tr>

        <tr>
          <th>CC</th>
          <td>llvm-bugs@lists.llvm.org
          </td>
        </tr></table>
      <p>
        <div>
        <pre>1. Use C++ code:

#include <boost/variant>
#include <vector>
#include <string>

template<typename ParentType>
struct Example
{
    using Variant = boost::variant<int, std::string, std::vector<ParentType>>;
};

int main()
{
    Example<float>::Variant ex(std::string("string"));
    Example<float>::Variant ex2(10);
    return ex.which() == ex2.which();
}


2. Use formatter for boost::variant:

import lldb
import lldb.formatters.Logger

def get_template_arg(valobj, i):
    valobj_type = valobj.GetType().GetUnqualifiedType()
    if valobj_type.IsReferenceType():
        valobj_type = valobj_type.GetDereferencedType()
    if valobj_type.GetNumberOfTemplateArguments() > i:
        data_type = valobj_type.GetTemplateArgumentType(i)
    else:
        data_type = None
    return data_type

class BoostVariantSynthProvider:
    def __init__(self, valobj, dict):
        self.val_obj = valobj
        self.value = None
        self.update()

    def num_children(self):
        return 1

    def has_children(self):
        return True

    def get_child_index(self, name):
        if name == "value":
            return 0

        return -1

    def get_child_at_index(self, index):
        if index == 0:
            return self.value

        return None

    def update(self):
        type_index =
self.val_obj.GetChildMemberWithName("which_").GetValueAsUnsigned()
        element_type = get_template_arg(self.val_obj, type_index)
        self.value =
self.val_obj.GetChildMemberWithName("storage_").GetChildMemberWithName("data_").
\
            GetChildMemberWithName("buf").CreateChildAtOffset("value", 0,
element_type)

Actual:
GetNumberOfTemplateArguments() returns 1 for Example<float>::Variant type and
get_template_arg returns 'None'
Expected:
GetNumberOfTemplateArguments() should return 3 for Example<float>::Variant type
and get_template_arg should returns std::string type</pre>
        </div>
      </p>


      <hr>
      <span>You are receiving this mail because:</span>

      <ul>
          <li>You are the assignee for the bug.</li>
      </ul>
    </body>
</html>