| /* { dg-options "-fdiagnostics-show-caret" } */ |
| |
| void takes_int_ptr(int*); |
| void takes_char_ptr(char*); |
| void takes_int(int); |
| int returns_int(void); |
| |
| int ivar; |
| char cvar; |
| int *int_ptr; |
| char *char_ptr; |
| |
| void test_1 (void) |
| { |
| takes_int_ptr(&ivar); |
| takes_int_ptr(int_ptr); |
| takes_char_ptr(&cvar); |
| takes_char_ptr(char_ptr); |
| |
| ivar = 42; |
| cvar = 'b'; |
| int_ptr = &ivar; |
| char_ptr = &cvar; |
| } |
| |
| void test_2 (void) |
| { |
| takes_int_ptr(ivar); /* { dg-error "" "" } */ |
| /* { dg-message "possible fix: take the address with '&'" "" { target *-*-* } .-1 } */ |
| |
| /* Expect an '&' fix-it hint. */ |
| /* { dg-begin-multiline-output "" } |
| takes_int_ptr(ivar); |
| ^~~~ |
| | |
| int |
| { dg-end-multiline-output "" } */ |
| /* { dg-begin-multiline-output "" } |
| takes_int_ptr(ivar); |
| ^~~~ |
| & |
| { dg-end-multiline-output "" } */ |
| /* { dg-begin-multiline-output "" } |
| void takes_int_ptr(int*); |
| ^~~~ |
| { dg-end-multiline-output "" } */ |
| } |
| |
| void test_3 (void) |
| { |
| takes_int_ptr(cvar); /* { dg-error "" } */ |
| |
| /* Don't expect an '&' fix-it hint. */ |
| /* { dg-begin-multiline-output "" } |
| takes_int_ptr(cvar); |
| ^~~~ |
| | |
| char |
| { dg-end-multiline-output "" } */ |
| /* { dg-begin-multiline-output "" } |
| void takes_int_ptr(int*); |
| ^~~~ |
| { dg-end-multiline-output "" } */ |
| } |
| |
| void test_4 (void) |
| { |
| takes_char_ptr(ivar); /* { dg-error "" } */ |
| |
| /* Don't expect an '&' fix-it hint. */ |
| /* { dg-begin-multiline-output "" } |
| takes_char_ptr(ivar); |
| ^~~~ |
| | |
| int |
| { dg-end-multiline-output "" } */ |
| /* { dg-begin-multiline-output "" } |
| void takes_char_ptr(char*); |
| ^~~~~ |
| { dg-end-multiline-output "" } */ |
| } |
| |
| void test_5 (void) |
| { |
| takes_char_ptr(cvar); /* { dg-error "" } */ |
| |
| /* Expect an '&' fix-it hint. */ |
| /* { dg-begin-multiline-output "" } |
| takes_char_ptr(cvar); |
| ^~~~ |
| | |
| char |
| { dg-end-multiline-output "" } */ |
| /* { dg-begin-multiline-output "" } |
| takes_char_ptr(cvar); |
| ^~~~ |
| & |
| { dg-end-multiline-output "" } */ |
| /* { dg-begin-multiline-output "" } |
| void takes_char_ptr(char*); |
| ^~~~~ |
| { dg-end-multiline-output "" } */ |
| } |
| |
| void test_6 (void) |
| { |
| takes_int(int_ptr); /* { dg-error "" } */ |
| /* { dg-message "possible fix: dereference with '*'" "" { target *-*-* } .-1 } */ |
| |
| /* Expect a '*' fix-it hint. */ |
| /* { dg-begin-multiline-output "" } |
| takes_int(int_ptr); |
| ^~~~~~~ |
| | |
| int * |
| { dg-end-multiline-output "" { target c } } */ |
| /* { dg-begin-multiline-output "" } |
| takes_int(int_ptr); |
| ^~~~~~~ |
| | |
| int* |
| { dg-end-multiline-output "" { target c++ } } */ |
| /* { dg-begin-multiline-output "" } |
| takes_int(int_ptr); |
| ^~~~~~~ |
| * |
| { dg-end-multiline-output "" } */ |
| /* { dg-begin-multiline-output "" } |
| void takes_int(int); |
| ^~~ |
| { dg-end-multiline-output "" } */ |
| } |
| |
| void test_7 (void) |
| { |
| takes_int(char_ptr); /* { dg-error "" } */ |
| |
| /* Don't expect a '*' fix-it hint. */ |
| /* { dg-begin-multiline-output "" } |
| takes_int(char_ptr); |
| ^~~~~~~~ |
| | |
| char * |
| { dg-end-multiline-output "" { target c } } */ |
| /* { dg-begin-multiline-output "" } |
| takes_int(char_ptr); |
| ^~~~~~~~ |
| | |
| char* |
| { dg-end-multiline-output "" { target c++ } } */ |
| /* { dg-begin-multiline-output "" } |
| void takes_int(int); |
| ^~~ |
| { dg-end-multiline-output "" } */ |
| } |
| |
| void test_8 (void) |
| { |
| ivar = int_ptr; /* { dg-error "" } */ |
| |
| /* Expect a fix-it hint from the C++ FE, but not from C (due to missing |
| location). */ |
| /* { dg-begin-multiline-output "" } |
| ivar = int_ptr; |
| ^~~~~~~ |
| | |
| int* |
| { dg-end-multiline-output "" { target c++ } } */ |
| /* { dg-begin-multiline-output "" } |
| ivar = int_ptr; |
| ^~~~~~~ |
| * |
| { dg-end-multiline-output "" { target c++ } } */ |
| /* { dg-begin-multiline-output "" } |
| ivar = int_ptr; |
| ^ |
| { dg-end-multiline-output "" { target c } } */ |
| } |
| |
| void test_9 (void) |
| { |
| cvar = int_ptr; /* { dg-error "" } */ |
| |
| /* Don't expect a '*' fix-it hint. */ |
| /* { dg-begin-multiline-output "" } |
| cvar = int_ptr; |
| ^~~~~~~ |
| | |
| int* |
| { dg-end-multiline-output "" { target c++ } } */ |
| /* { dg-begin-multiline-output "" } |
| cvar = int_ptr; |
| ^ |
| { dg-end-multiline-output "" { target c } } */ |
| } |
| |
| void test_10 (void) |
| { |
| int_ptr = ivar; /* { dg-error "" } */ |
| |
| /* Expect a fix-it hint from the C++ FE, but not from C (due to missing |
| location). */ |
| /* { dg-begin-multiline-output "" } |
| int_ptr = ivar; |
| ^~~~ |
| | |
| int |
| { dg-end-multiline-output "" { target c++ } } */ |
| /* { dg-begin-multiline-output "" } |
| int_ptr = ivar; |
| ^~~~ |
| & |
| { dg-end-multiline-output "" { target c++ } } */ |
| /* { dg-begin-multiline-output "" } |
| int_ptr = ivar; |
| ^ |
| { dg-end-multiline-output "" { target c } } */ |
| } |
| |
| void test_11 (void) |
| { |
| char_ptr = ivar; /* { dg-error "" } */ |
| |
| /* Don't expect a fix-it hint, due to mismatching types. */ |
| /* { dg-begin-multiline-output "" } |
| char_ptr = ivar; |
| ^~~~ |
| | |
| int |
| { dg-end-multiline-output "" { target c++ } } */ |
| /* { dg-begin-multiline-output "" } |
| char_ptr = ivar; |
| ^ |
| { dg-end-multiline-output "" { target c } } */ |
| } |
| |
| /* We shouldn't offer '&' fix-it hints for non-lvalues. */ |
| |
| void test_12 (void) |
| { |
| takes_int_ptr (returns_int ()); /* { dg-error "" } */ |
| |
| /* { dg-begin-multiline-output "" } |
| takes_int_ptr (returns_int ()); |
| ^~~~~~~~~~~~~~ |
| | |
| int |
| { dg-end-multiline-output "" { target c } } */ |
| /* { dg-begin-multiline-output "" } |
| takes_int_ptr (returns_int ()); |
| ~~~~~~~~~~~~^~ |
| | |
| int |
| { dg-end-multiline-output "" { target c++ } } */ |
| /* { dg-begin-multiline-output "" } |
| void takes_int_ptr(int*); |
| ^~~~ |
| { dg-end-multiline-output "" } */ |
| } |
| |
| /* Ignore typedefs when offering fix-it hints. */ |
| |
| typedef int typedef_int_t; |
| typedef_int_t typedef_int_t_var; |
| |
| void test_13 (void) |
| { |
| takes_int_ptr (typedef_int_t_var); /* { dg-error "" } */ |
| /* { dg-message "possible fix: take the address with '&'" "" { target *-*-* } .-1 } */ |
| |
| /* Expect an '&' fix-it hint. */ |
| /* { dg-begin-multiline-output "" } |
| takes_int_ptr (typedef_int_t_var); |
| ^~~~~~~~~~~~~~~~~ |
| | |
| typedef_int_t {aka int} |
| { dg-end-multiline-output "" } */ |
| /* { dg-begin-multiline-output "" } |
| takes_int_ptr (typedef_int_t_var); |
| ^~~~~~~~~~~~~~~~~ |
| & |
| { dg-end-multiline-output "" } */ |
| /* { dg-begin-multiline-output "" } |
| void takes_int_ptr(int*); |
| ^~~~ |
| { dg-end-multiline-output "" } */ |
| } |
| |
| enum foo |
| { |
| FOO_0, |
| FOO_1, |
| FOO_2 |
| }; |
| |
| void test_14 (void) |
| { |
| enum foo f; |
| takes_int_ptr (f); /* { dg-error "" } */ |
| /* We don't expect a fix-it hint here. */ |
| /* { dg-begin-multiline-output "" } |
| takes_int_ptr (f); |
| ^ |
| | |
| enum foo |
| { dg-end-multiline-output "" { target c } } */ |
| /* { dg-begin-multiline-output "" } |
| takes_int_ptr (f); |
| ^ |
| | |
| foo |
| { dg-end-multiline-output "" { target c++ } } */ |
| /* { dg-begin-multiline-output "" } |
| void takes_int_ptr(int*); |
| ^~~~ |
| { dg-end-multiline-output "" } */ |
| } |