Инициализация структуры в другой структуре с использованием назначенного инициализатора вызывает ошибку компиляции в Visual Studio 2013

В Visual Studio 2013 следующий фрагмент кода вызывает ошибку компиляции.

ошибка C2440: «инициализация»: невозможно преобразовать из «TestSubStruct» в «int»

#include <stdio.h>

typedef struct TestSubStruct {
    int test;
} TestSubStruct;

typedef struct TestStruct {
    TestSubStruct sub;
} TestStruct;

int main(int argc, char* argv[])
{
    TestSubStruct r = {0};
    TestStruct vp = { .sub = r}; // this line causes the error
    return 0;
}

Это можно легко переписать так, чтобы оно компилировалось, но я хочу знать, почему код не компилируется как есть. Нарушает ли это как-то спецификацию статических инициализаторов? Это просто проблема с MSVC или другие компиляторы тоже не могут это построить?

EDIT: Судя по комментаторам, это проблема MSVC. В этом случае мой вопрос: каковы точные ограничения поддержки MSVC 2013 для статических инициализаторов?


comment
Компилируется нормально в gcc и clang.   -  person Charlie Burns    schedule 17.05.2014
comment
Вызывает неопределенное поведение, поскольку r не инициализирован   -  person M.M    schedule 17.05.2014
comment
Я изменил вопрос, так что r инициализируется, а ошибка все та же.   -  person John    schedule 17.05.2014
comment
@johnpeeb, должно быть, это рассеянный склероз. Я подтверждаю, что он собирается без ошибок на gcc 4.3.   -  person Mahonri Moriancumer    schedule 17.05.2014
comment
@CharlieBurns и MahonriMoriancumer: Спасибо, что нашли время попробовать скомпилировать в других компиляторах. Это просто оставляет вопрос о том, каковы ограничения MSVC с поддержкой статических инициализаторов. (У него есть по крайней мере некоторая поддержка для них.)   -  person John    schedule 17.05.2014
comment
@johnpeeb, я изменил с { .sub = r}; на { .sub = (TestSubStruct)r}, и все равно получил ошибку от VS2013: error C2440: 'type cast' : cannot convert from 'TestSubStruct' to 'TestSubStruct' Classic Microsoft.   -  person Mahonri Moriancumer    schedule 17.05.2014
comment
Это функция C99, MSVC реализует C89. Просто { r } здесь очевидный обходной путь.   -  person Hans Passant    schedule 17.05.2014
comment
@HansPassant Согласно документам VS, VS 2013 должен поддерживать назначенные инициализаторы, даже если они являются функцией C99. Кроме того, я только что нашел этот недавний подтвержденный отчет об ошибке, который похож на проблему, с которой я столкнулся. Так что возможно это просто баг.   -  person John    schedule 18.05.2014