/* { dg-do compile } */ /* { dg-options "-fdiagnostics-show-caret" } */ void test_1 (signed char e); /* PR c/70339. */ void test_2 (singed char e); /* { dg-error "14: unknown type name .singed.; did you mean .signed.?" } */ /* { dg-begin-multiline-output "" } void test_2 (singed char e); ^~~~~~ signed { dg-end-multiline-output "" } */ void test_3 (car e); /* { dg-error "14: unknown type name .car.; did you mean .char.?" } */ /* { dg-begin-multiline-output "" } void test_3 (car e); ^~~ char { dg-end-multiline-output "" } */ /* TODO: this one could be handled better. */ void test_4 (signed car e); /* { dg-error "25: before .e." } */ /* { dg-begin-multiline-output "" } void test_4 (signed car e); ^ { dg-end-multiline-output "" } */ /* Verify that we handle misspelled typedef names. */ typedef struct something {} something_t; some_thing_t test_5; /* { dg-error "1: unknown type name .some_thing_t.; did you mean .something_t.?" } */ /* { dg-begin-multiline-output "" } some_thing_t test_5; ^~~~~~~~~~~~ something_t { dg-end-multiline-output "" } */ /* TODO: we don't yet handle misspelled struct names. */ struct some_thing test_6; /* { dg-error "storage size of .test_6. isn't known" } */ /* { dg-begin-multiline-output "" } struct some_thing test_6; ^~~~~~ { dg-end-multiline-output "" } */ typedef long int64_t; int64 i; /* { dg-error "unknown type name 'int64'; did you mean 'int64_t'?" } */ /* { dg-begin-multiline-output "" } int64 i; ^~~~~ int64_t { dg-end-multiline-output "" } */ /* Verify that gcc doesn't offer nonsensical suggestions. */ nonsensical_suggestion_t var; /* { dg-bogus "did you mean" } */ /* { dg-error "unknown type name" "" { target { *-*-* } } .-1 } */ /* { dg-begin-multiline-output "" } nonsensical_suggestion_t var; ^~~~~~~~~~~~~~~~~~~~~~~~ { dg-end-multiline-output "" } */ /* In the following, we should suggest inserting "struct" (rather than "did you mean 'float'") and provide a fixit hint. */ struct foo_t { int i; }; foo_t *foo_ptr; /* { dg-error "1: unknown type name .foo_t.; use .struct. keyword to refer to the type" } */ /* { dg-begin-multiline-output "" } foo_t *foo_ptr; ^~~~~ struct { dg-end-multiline-output "" } */ /* Similarly for unions. */ union bar_t { int i; char j; }; bar_t *bar_ptr; /* { dg-error "1: unknown type name .bar_t.; use .union. keyword to refer to the type" } */ /* { dg-begin-multiline-output "" } bar_t *bar_ptr; ^~~~~ union { dg-end-multiline-output "" } */ /* Similarly for enums. */ enum baz { BAZ_FIRST, BAZ_SECOND }; baz value; /* { dg-error "1: unknown type name .baz.; use .enum. keyword to refer to the type" } */ /* { dg-begin-multiline-output "" } baz value; ^~~ enum { dg-end-multiline-output "" } */ /* TODO: it would be better to detect the "singed" vs "signed" typo here. */ singed char ch; /* { dg-error "7: before .char." } */ /* { dg-begin-multiline-output "" } singed char ch; ^~~~~ ; { dg-end-multiline-output "" } */