Является ли приведенный ниже пример действительной полной единицей перевода в 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?