|
1 | | -/* $NetBSD: decl.c,v 1.423 2026/01/17 14:27:08 rillig Exp $ */ |
| 1 | +/* $NetBSD: decl.c,v 1.424 2026/01/20 23:33:05 rillig Exp $ */ |
2 | 2 |
|
3 | 3 | /* |
4 | 4 | * Copyright (c) 1996 Christopher G. Demetriou. All Rights Reserved. |
|
38 | 38 |
|
39 | 39 | #include <sys/cdefs.h> |
40 | 40 | #if defined(__RCSID) |
41 | | -__RCSID("$NetBSD: decl.c,v 1.423 2026/01/17 14:27:08 rillig Exp $"); |
| 41 | +__RCSID("$NetBSD: decl.c,v 1.424 2026/01/20 23:33:05 rillig Exp $"); |
42 | 42 | #endif |
43 | 43 |
|
44 | 44 | #include <sys/param.h> |
@@ -352,11 +352,8 @@ dcs_add_type(type_t *tp) |
352 | 352 | t = FCOMPLEX; |
353 | 353 | else if (dcs->d_complex_mod == DOUBLE) |
354 | 354 | t = DCOMPLEX; |
355 | | - else { |
356 | | - /* invalid type for _Complex */ |
357 | | - error(308); |
358 | | - t = DCOMPLEX; /* just as a fallback */ |
359 | | - } |
| 355 | + else if (dcs->d_abstract_type == NO_TSPEC) |
| 356 | + t = COMPLEX; |
360 | 357 | dcs->d_complex_mod = NO_TSPEC; |
361 | 358 | } |
362 | 359 |
|
@@ -395,9 +392,11 @@ dcs_add_type(type_t *tp) |
395 | 392 | dcs->d_invalid_type_combination = true; |
396 | 393 | dcs->d_abstract_type = t; |
397 | 394 | } |
398 | | - } else if (t == PTR) { |
| 395 | + } else if (t == PTR) |
399 | 396 | dcs->d_type = tp; |
400 | | - } else { |
| 397 | + else if (t == COMPLEX && dcs->d_abstract_type == NO_TSPEC) |
| 398 | + dcs->d_abstract_type = t; |
| 399 | + else { |
401 | 400 | if (dcs->d_abstract_type != NO_TSPEC) |
402 | 401 | dcs->d_invalid_type_combination = true; |
403 | 402 | dcs->d_abstract_type = t; |
@@ -723,6 +722,17 @@ dcs_merge_declaration_specifiers(void) |
723 | 722 | if (t == LDOUBLE && !allow_c90) |
724 | 723 | /* 'long double' requires C90 or later */ |
725 | 724 | warning(266); |
| 725 | + if (t == COMPLEX && c == FLOAT) |
| 726 | + t = FCOMPLEX; |
| 727 | + else if (t == COMPLEX && c == DOUBLE) |
| 728 | + t = DCOMPLEX; |
| 729 | + else if (t == COMPLEX && c == LDOUBLE) |
| 730 | + t = LCOMPLEX; |
| 731 | + else if (t == COMPLEX) { |
| 732 | + /* invalid type for _Complex */ |
| 733 | + error(308); |
| 734 | + t = DCOMPLEX; |
| 735 | + } |
726 | 736 | if (l == LONG && t == DCOMPLEX) { |
727 | 737 | l = NO_TSPEC; |
728 | 738 | t = LCOMPLEX; |
|
0 commit comments