forked from OSchip/llvm-project
implement PR3962: diagnose more faulty cases of usage of the restrict qualifier. this also removes a FIXME
llvm-svn: 91601
This commit is contained in:
parent
641fdce235
commit
e9823fab83
|
@ -1365,6 +1365,8 @@ def warn_typecheck_function_qualifiers : Warning<
|
|||
"qualifier on function type %0 has unspecified behavior">;
|
||||
def err_typecheck_invalid_restrict_not_pointer : Error<
|
||||
"restrict requires a pointer or reference (%0 is invalid)">;
|
||||
def err_typecheck_invalid_restrict_not_pointer_noarg : Error<
|
||||
"restrict requires a pointer or reference">;
|
||||
def err_typecheck_invalid_restrict_invalid_pointee : Error<
|
||||
"pointer to function type %0 may not be 'restrict' qualified">;
|
||||
def ext_typecheck_zero_array_size : Extension<
|
||||
|
|
|
@ -1445,7 +1445,6 @@ bool Sema::CheckParmsForFunctionDef(FunctionDecl *FD) {
|
|||
Sema::DeclPtrTy Sema::ParsedFreeStandingDeclSpec(Scope *S, DeclSpec &DS) {
|
||||
// FIXME: Error on auto/register at file scope
|
||||
// FIXME: Error on inline/virtual/explicit
|
||||
// FIXME: Error on invalid restrict
|
||||
// FIXME: Warn on useless __thread
|
||||
// FIXME: Warn on useless const/volatile
|
||||
// FIXME: Warn on useless static/extern/typedef/private_extern/mutable
|
||||
|
@ -1467,6 +1466,15 @@ Sema::DeclPtrTy Sema::ParsedFreeStandingDeclSpec(Scope *S, DeclSpec &DS) {
|
|||
Tag = dyn_cast<TagDecl>(TagD);
|
||||
}
|
||||
|
||||
if (unsigned TypeQuals = DS.getTypeQualifiers()) {
|
||||
// Enforce C99 6.7.3p2: "Types other than pointer types derived from object
|
||||
// or incomplete types shall not be restrict-qualified."
|
||||
if (TypeQuals & DeclSpec::TQ_restrict)
|
||||
Diag(DS.getRestrictSpecLoc(),
|
||||
diag::err_typecheck_invalid_restrict_not_pointer_noarg)
|
||||
<< DS.getSourceRange();
|
||||
}
|
||||
|
||||
if (DS.isFriendSpecified()) {
|
||||
// If we're dealing with a class template decl, assume that the
|
||||
// template routines are handling it.
|
||||
|
|
|
@ -21,3 +21,4 @@ __restrict__ f* v2; // expected-error {{restrict requires a pointer or referenc
|
|||
__restrict__ fptr v3; // expected-error {{pointer to function type 'f' (aka 'int (void)') may not be 'restrict' qualified}}
|
||||
f *__restrict__ v4; // expected-error {{pointer to function type 'f' (aka 'int (void)') may not be 'restrict' qualified}}
|
||||
|
||||
restrict struct hallo; // expected-error {{restrict requires a pointer or reference}}
|
||||
|
|
Loading…
Reference in New Issue