mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2025-02-14 14:56:47 +00:00
Sema: Don't permit variably modified types in typeid
GCC and ICC both reject this and the 'Runtime-sized arrays with automatic storage duration' (N3639) paper forbade this as well. Previously, we would crash on our way to mangling. This fixes PR21632. llvm-svn: 222569
This commit is contained in:
parent
d517801493
commit
6f3150a7d2
@ -5303,6 +5303,7 @@ def err_uuidof_without_guid : Error<
|
||||
def err_uuidof_with_multiple_guids : Error<
|
||||
"cannot call operator __uuidof on a type with multiple GUIDs">;
|
||||
def err_incomplete_typeid : Error<"'typeid' of incomplete type %0">;
|
||||
def err_variably_modified_typeid : Error<"'typeid' of variably modified type %0">;
|
||||
def err_static_illegal_in_new : Error<
|
||||
"the 'static' modifier for the array size is not legal in new expressions">;
|
||||
def err_array_new_needs_size : Error<
|
||||
|
@ -384,6 +384,9 @@ ExprResult Sema::BuildCXXTypeId(QualType TypeInfoType,
|
||||
RequireCompleteType(TypeidLoc, T, diag::err_incomplete_typeid))
|
||||
return ExprError();
|
||||
|
||||
if (T->isVariablyModifiedType())
|
||||
return ExprError(Diag(TypeidLoc, diag::err_variably_modified_typeid) << T);
|
||||
|
||||
return new (Context) CXXTypeidExpr(TypeInfoType.withConst(), Operand,
|
||||
SourceRange(TypeidLoc, RParenLoc));
|
||||
}
|
||||
@ -438,6 +441,10 @@ ExprResult Sema::BuildCXXTypeId(QualType TypeInfoType,
|
||||
}
|
||||
}
|
||||
|
||||
if (E->getType()->isVariablyModifiedType())
|
||||
return ExprError(Diag(TypeidLoc, diag::err_variably_modified_typeid)
|
||||
<< E->getType());
|
||||
|
||||
return new (Context) CXXTypeidExpr(TypeInfoType.withConst(), E,
|
||||
SourceRange(TypeidLoc, RParenLoc));
|
||||
}
|
||||
|
@ -21,3 +21,9 @@ void g1(X &x) {
|
||||
(void)typeid(X&); // expected-error{{'typeid' of incomplete type 'X'}}
|
||||
(void)typeid(x); // expected-error{{'typeid' of incomplete type 'X'}}
|
||||
}
|
||||
|
||||
void h(int i) {
|
||||
char V[i];
|
||||
typeid(V); // expected-error{{'typeid' of variably modified type 'char [i]'}}
|
||||
typeid(char [i]); // expected-error{{'typeid' of variably modified type 'char [i]'}}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user