Является ли приведенный ниже пример действительной полной единицей перевода в C?
struct foo;
struct foo *bar(struct foo *j)
{
return &*j;
}
struct foo является неполным типом, но я не могу найти явный запрет на разглашение неполного типа в стандарте C. В частности, в п. 6.5.3.2 говорится:
Унарный оператор
&дает адрес своего операнда. Если операнд имеет тип типа '', результат имеет тип '' указатель на тип. Если операнд является результатом унарного оператора*, ни тот, который оператора или оператора&, и результат будет таким, как если бы оба они были опущены, за исключением того, что ограничения на операторы по-прежнему применяется, и результат не является значением l.
Тот факт, что результат не является значением lvalue, не является родным - возвращаемые значения не обязательно должны быть. Ограничения для оператора * просто:
Операнд унарного * оператора должен иметь тип указателя.
и оператора &:
Операнд унарного оператора
&должен быть либо функцией обозначение, результат оператора[]или унарного*, или lvalue который обозначает объект, который не является битовым полем и не объявлен сregisterспецификатором класса хранения.
Оба из них тривиально удовлетворяются здесь, поэтому результат должен быть эквивалентен просто return j;.
Однако gcc 4.4.5 не компилирует этот код. Вместо этого он дает следующую ошибку:
y.c:5: error: dereferencing pointer to incomplete type
Является ли это дефектом в gcc?