inline.c revision 11b46a0a49075f338eb4849c2b7d680945be9250
1// RUN: %clang_cc1 -fsyntax-only -verify %s 2 3#if defined(INCLUDE) 4// ------- 5// This section acts like a header file. 6// ------- 7 8// Check the use of static variables in non-static inline functions. 9static int staticVar; // expected-note + {{'staticVar' declared here}} 10static int staticFunction(); // expected-note + {{'staticFunction' declared here}} 11 12inline int useStatic () { // expected-note 2 {{use 'static' to give inline function 'useStatic' internal linkage}} 13 staticFunction(); // expected-warning{{function 'staticFunction' has internal linkage but is used in an inline function with external linkage}} 14 return staticVar; // expected-warning{{variable 'staticVar' has internal linkage but is used in an inline function with external linkage}} 15} 16 17extern inline int useStaticFromExtern () { // no suggestions 18 staticFunction(); // expected-warning{{function 'staticFunction' has internal linkage but is used in an inline function with external linkage}} 19 return staticVar; // expected-warning{{variable 'staticVar' has internal linkage but is used in an inline function with external linkage}} 20} 21 22static inline int useStaticFromStatic () { 23 staticFunction(); // no-warning 24 return staticVar; // no-warning 25} 26 27#else 28// ------- 29// This is the main source file. 30// ------- 31 32#define INCLUDE 33#include "inline.c" 34 35// Check that we don't allow illegal uses of inline 36inline int a; // expected-error{{'inline' can only appear on functions}} 37typedef inline int b; // expected-error{{'inline' can only appear on functions}} 38int d(inline int a); // expected-error{{'inline' can only appear on functions}} 39 40// Check that the warnings from the "header file" aren't on by default in 41// the main source file. 42 43inline int useStaticMain () { 44 staticFunction(); // no-warning 45 return staticVar; // no-warning 46} 47 48// Check that the warnings show up when explicitly requested. 49 50#pragma clang diagnostic push 51#pragma clang diagnostic warning "-Winternal-linkage-in-inline" 52 53inline int useStaticAgain () { // expected-note 2 {{use 'static' to give inline function 'useStaticAgain' internal linkage}} 54 staticFunction(); // expected-warning{{function 'staticFunction' has internal linkage but is used in an inline function with external linkage}} 55 return staticVar; // expected-warning{{variable 'staticVar' has internal linkage but is used in an inline function with external linkage}} 56} 57 58#pragma clang diagnostic pop 59 60#endif 61 62 63