Skip to content

Commit 0daca80

Browse files
committed
Fix issues with WG14 N3344 changes
This amends 24e2e25 with a fix for 'register void *', which is still okay as a function parameter.
1 parent e3b0ef7 commit 0daca80

File tree

2 files changed

+7
-1
lines changed

2 files changed

+7
-1
lines changed

clang/lib/Sema/SemaDecl.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15021,7 +15021,8 @@ Decl *Sema::ActOnParamDeclarator(Scope *S, Declarator &D,
1502115021
: diag::warn_deprecated_register)
1502215022
<< FixItHint::CreateRemoval(DS.getStorageClassSpecLoc());
1502315023
} else if (!getLangOpts().CPlusPlus &&
15024-
DS.getTypeSpecType() == DeclSpec::TST_void) {
15024+
DS.getTypeSpecType() == DeclSpec::TST_void &&
15025+
D.getNumTypeObjects() == 0) {
1502515026
Diag(DS.getStorageClassSpecLoc(),
1502615027
diag::err_invalid_storage_class_in_func_decl)
1502715028
<< FixItHint::CreateRemoval(DS.getStorageClassSpecLoc());

clang/test/C/C2y/n3344.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
void baz(volatile void); // expected-error {{'void' as parameter must not have type qualifiers}}
1717
void bar(const void); // expected-error {{'void' as parameter must not have type qualifiers}}
1818
void foo(register void); // expected-error {{invalid storage class specifier in function declarator}}
19+
void foop(void register); // expected-error {{invalid storage class specifier in function declarator}}
1920
void quux(static void); // expected-error {{invalid storage class specifier in function declarator}}
2021
void quobble(auto void); // expected-error {{invalid storage class specifier in function declarator}}
2122
void quubble(extern void); // expected-error {{invalid storage class specifier in function declarator}}
@@ -28,3 +29,7 @@ void quabble(_Thread_local void); // expected-error {{'_Thread_local' is only al
2829
#endif
2930
void bing(void, ...); // expected-error {{'void' must be the first and only parameter if specified}}
3031

32+
// These declarations are fine.
33+
void one(register void *);
34+
void two(void register *);
35+
void three(register void * (*)[4]);

0 commit comments

Comments
 (0)