mirror of https://github.com/ARMmbed/mbed-os.git
				
				
				
			Add MBED_FALLTHROUGH attribute
C++17 standardised `[[fallthrough]]` for `switch` statements to suppress compiler warnings. Provide access to it, or compiler-specific alternatives.pull/12032/head
							parent
							
								
									888dfffabf
								
							
						
					
					
						commit
						d97460f8bb
					
				| 
						 | 
				
			
			@ -145,6 +145,24 @@ int testNoReturn()
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
int testFallthrough1(int i)
 | 
			
		||||
{
 | 
			
		||||
    switch (i) {
 | 
			
		||||
        case 1:
 | 
			
		||||
        case 2:
 | 
			
		||||
            i *= 2;
 | 
			
		||||
            MBED_FALLTHROUGH;
 | 
			
		||||
        default:
 | 
			
		||||
            return i;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int testFallthrough()
 | 
			
		||||
{
 | 
			
		||||
    return testFallthrough1(0);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
int testUnreachable1(int i)
 | 
			
		||||
{
 | 
			
		||||
    switch (i) {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -33,6 +33,7 @@ extern "C" {
 | 
			
		|||
    int testPure();
 | 
			
		||||
    int testForceInline();
 | 
			
		||||
    int testNoReturn();
 | 
			
		||||
    int testFallthrough();
 | 
			
		||||
    int testUnreachable();
 | 
			
		||||
    int testDeprecated();
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -59,6 +60,7 @@ Case cases[] = {
 | 
			
		|||
    Case("Testing PURE attribute",          test_wrapper<testPure>),
 | 
			
		||||
    Case("Testing FORCEINLINE attribute",   test_wrapper<testForceInline>),
 | 
			
		||||
    Case("Testing NORETURN attribute",      test_wrapper<testNoReturn>),
 | 
			
		||||
    Case("Testing FALLTHROUGH attribute",   test_wrapper<testFallthrough>),
 | 
			
		||||
    Case("Testing UNREACHABLE attribute",   test_wrapper<testUnreachable>),
 | 
			
		||||
    Case("Testing DEPRECATED attribute",    test_wrapper<testDeprecated>),
 | 
			
		||||
};
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -340,6 +340,44 @@
 | 
			
		|||
#endif
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/** MBED_FALLTHROUGH
 | 
			
		||||
 *  Marks a point in a switch statement where fallthrough can occur.
 | 
			
		||||
 *  Should be placed as the last statement before a label.
 | 
			
		||||
 *
 | 
			
		||||
 *  @code
 | 
			
		||||
 *  #include "mbed_toolchain.h"
 | 
			
		||||
 *
 | 
			
		||||
 *  int foo(int arg) {
 | 
			
		||||
 *      switch (arg) {
 | 
			
		||||
 *          case 1:
 | 
			
		||||
 *          case 2:
 | 
			
		||||
 *          case 3:
 | 
			
		||||
 *              arg *= 2;
 | 
			
		||||
 *              MBED_FALLTHROUGH;
 | 
			
		||||
 *          default:
 | 
			
		||||
 *              return arg;
 | 
			
		||||
 *      }
 | 
			
		||||
 *  }
 | 
			
		||||
 *  @endcode
 | 
			
		||||
 */
 | 
			
		||||
#ifndef MBED_FALLTHROUGH
 | 
			
		||||
#if __cplusplus >= 201703
 | 
			
		||||
#define MBED_FALLTHROUGH [[fallthrough]]
 | 
			
		||||
#elif defined(__clang__)
 | 
			
		||||
#if __cplusplus >= 201103
 | 
			
		||||
#define MBED_FALLTHROUGH [[clang::fallthrough]]
 | 
			
		||||
#elif __has_attribute(fallthrough)
 | 
			
		||||
#define MBED_FALLTHROUGH __attribute__((fallthrough))
 | 
			
		||||
#else
 | 
			
		||||
#define MBED_FALLTHROUGH
 | 
			
		||||
#endif
 | 
			
		||||
#elif defined (__GNUC__) && !defined(__CC_ARM)
 | 
			
		||||
#define MBED_FALLTHROUGH __attribute__((fallthrough))
 | 
			
		||||
#else
 | 
			
		||||
#define MBED_FALLTHROUGH
 | 
			
		||||
#endif
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/** MBED_DEPRECATED("message string")
 | 
			
		||||
 *  Mark a function declaration as deprecated, if it used then a warning will be
 | 
			
		||||
 *  issued by the compiler possibly including the provided message. Note that not
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue