[lldb-dev] [Bug 32300] New: Wrong resolving boost::variant template arguments by formatters API

via lldb-dev lldb-dev at lists.llvm.org
Thu Mar 16 01:12:02 PDT 2017


            Bug ID: 32300
           Summary: Wrong resolving boost::variant template arguments by
                    formatters API
           Product: lldb
           Version: 3.9
          Hardware: Macintosh
                OS: MacOS X
            Status: NEW
          Severity: normal
          Priority: P
         Component: All Bugs
          Assignee: lldb-dev at lists.llvm.org
          Reporter: andrew.stepanov.i at gmail.com
                CC: llvm-bugs at lists.llvm.org

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)
        data_type = None
    return data_type

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

    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 =
        element_type = get_template_arg(self.val_obj, type_index)
        self.value =
            GetChildMemberWithName("buf").CreateChildAtOffset("value", 0,

GetNumberOfTemplateArguments() returns 1 for Example<float>::Variant type and
get_template_arg returns 'None'
GetNumberOfTemplateArguments() should return 3 for Example<float>::Variant type
and get_template_arg should returns std::string type

You are receiving this mail because:
You are the assignee for the bug.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/lldb-dev/attachments/20170316/5f41ade4/attachment.html>

More information about the lldb-dev mailing list