баг студийного канпилера или фича?

Тема в разделе "LANGS.C", создана пользователем sn0w, 28 мар 2018.

  1. sn0w

    sn0w Active Member

    Публикаций:
    0
    Регистрация:
    27 фев 2010
    Сообщения:
    956
    столкнулся с одной неприятной вещью (не ожидал честно говоря) поэтому решил воспроизвести в минимизированном варианте. (Все оптимизации отключены, выпил анреференсед тоже отключён)

    Имеется VisualStudio 2017 15.6.4, на ней у меня прикручена LLVM 6.0.0 (Clang). Имеется следующий код:

    class base
    {
    int m_ba, m_bb, m_bc;
    public:
    base(int, int);
    };
    base::base(int, int)
    : m_ba{ 3 }, m_bb{ 2 }, m_bc{ 1 }
    {
    }

    class derived : public base
    {
    int m_da, m_db;
    public:
    derived();

    };
    derived::derived()
    : base{ 1,2,3 }, m_da{ 7 }, m_db { 8 } // интересующее место, интеличенс палит тоже
    {
    }

    int main()
    {
    derived test{};
    return 0;
    }

    при установленном платформтулсете LLVM-vs2014 – разумеется происходит ошибка компиляции, кленгу ненравится то что не то число аргументов при вызове родительского конструктора:
    1>ddump.cpp(26,4): error : no matching constructor for initialization of 'base'
    1> : base{ 1,2,3 }, m_da{ 7 }, m_db { 8 } // <E8><ED><F2><E5><F0><E5><F1><F3><FE><F9><E5><E5> <EC><E5><F1><F2><EE>
    1> ^ ~~~~~~~~~

    но если билдтулзы установлены стандартные - Visual Studio 2017 (v141), то есть микромягкий конпилер, то неожиданно всё собирается. Я сперва не понял — как так? Глянул что там нагенерилось, и оказалось что есть инициализация m_da{ 7 }, m_db { 8 } - и всё! рет! То есть нет ни кода вызова родительского конструктора, ни кода(как я сперва было подумал что cl решил сделать листинит просто, как структурных мемберов, мемберов родительского класса) ни этого самого лист-инита.

    Тоесть по завершении инициализации, test содержит 3 неинициализированных мембера родительского класса и 2 инициализированных в дочернем. Что за херня?

    У цланга в этом плане проблем нет. Кстати говоря, даже intellisense подсвечивает что мол-де ошибка с набором аргументов, но cl это похрен.

    есть идеи?
     
  2. sn0w

    sn0w Active Member

    Публикаций:
    0
    Регистрация:
    27 фев 2010
    Сообщения:
    956
    короче говоря, если ставить валидное число аргументов, например 2, как и должно быть ( : base{ 1,2,} ) - то код вызова конструктора родителя будет встроен. ежели 1, итд - то НЕТ. но ни ошибки ни предупреждения при этом не возникнет.
     
  3. CurryHowardIsomorphism

    CurryHowardIsomorphism Member

    Публикаций:
    0
    Регистрация:
    13 май 2017
    Сообщения:
    97
    Код (Text):
    1. source_file.cpp(20): error C2661: 'base::base': no overloaded function takes 3 arguments
    2. Microsoft (R) C/C++ Optimizing Compiler Version 19.00.23506 for x64
     
  4. sn0w

    sn0w Active Member

    Публикаций:
    0
    Регистрация:
    27 фев 2010
    Сообщения:
    956
    пардон, забыл про баннер:

    еще раз проверил. ситуация та же.
     

    Вложения:

    Последнее редактирование: 29 мар 2018
  5. sn0w

    sn0w Active Member

    Публикаций:
    0
    Регистрация:
    27 фев 2010
    Сообщения:
    956
    вот к чему пришёл:
    лист инит базовых мемберов будет, если все условия истинны:
    1) все мемберы public
    2) нет конструкторов
    3) нет vft

    конструктор будет вызван только при совпадении набора аргументов.
    но всё равно, отсутствие ошибки/предупреждения - это нехорошо. и вот хз как, но у товарищ отписалшийся выше, ошибку таки выдало.
     
  6. CurryHowardIsomorphism

    CurryHowardIsomorphism Member

    Публикаций:
    0
    Регистрация:
    13 май 2017
    Сообщения:
    97
  7. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    sn0w,
    1. Так пока что низя.
    2. Микрософтовский канпилер временами конпилет то, что конпилеться не должно. Например конпелит foo.get<float>() если foo зависит от шаблонного параметра (спойлер: в этом случае надо foo.template get<float>()).
     
  8. sn0w

    sn0w Active Member

    Публикаций:
    0
    Регистрация:
    27 фев 2010
    Сообщения:
    956
    законфирмили в технете кстати, сказали в следующем минорном релизе студии17 (в 15х такого кстати тоже не было) будет исправлено.
     
  9. CurryHowardIsomorphism

    CurryHowardIsomorphism Member

    Публикаций:
    0
    Регистрация:
    13 май 2017
    Сообщения:
    97
  10. sn0w

    sn0w Active Member

    Публикаций:
    0
    Регистрация:
    27 фев 2010
    Сообщения:
    956
    а второй превью только вышел когда я тему запилил. так шо всяко успел.