Немного заслуженных поздравлений.



У меня в магистерском курсе есть задания повышенной сложности (каждый год разные). Они построены так: есть некий замороченный код, где один компилятор работает, а другой нет и надо понять и обосновать стандартом кто прав. Я в некоторые пятницы такие брейнтизеры иногда скидываю в этот канал.



И я к таким заданиям обычно добавляю: поскольку очевидно кто-то не прав, вы получите высшую оценку за экзамен автоматом, т.е. безо всякого экзамена, если вы сделаете коммит в clang или gcc (смотря кто не прав) и его примут.



Много лет этой опцией никому не удавалось воспользовался. Люди пытались, но пройти ревью и влиться не могли. Но в этом году у нас есть первый победитель.



https://github.com/llvm/llvm-project/pull/118003



Мой студент Владислав Белов @sick_hoof со второго раза влил фикс в кланг. Первый раз его влили, но там в расширенных тестах упал assert и его откатили. Тот assert оказался ошибочным и в этом патче был торжественно удалён.



Ниже некоторые тесты, которые Владислав написал на свой коммит.



Вот тут он ожидает ошибку:

  template<typename T> struct A {

typedef int M;

struct B {

typedef void M;

struct C;

struct D;

};

};



template<typename T> struct A<T>::B::D : A<T*> {

M m;

// expected-error@-1 {{field has incomplete type 'M' (aka 'void'}}

};




А вот тут он ошибки не ожидает, это должно работать:

  template<typename T> struct G {

struct B {

typedef int M;

struct C {

typedef void M;

struct D;

};

};

};



template<typename T> struct G<T>::B::C::D : B {

M m;

};




Я полагаю, достойные студенты растут. Боевые. Самому иногда страшно становится.



#cpp_postgraduate