forked from mirrors/gecko-dev
		
	 0d4a611a04
			
		
	
	
		0d4a611a04
		
	
	
	
	
		
			
			MozReview-Commit-ID: AXrQEjWzxvg --HG-- extra : rebase_source : bf972fbb22648af2edbb756eb899ebddf8444dbc
		
			
				
	
	
		
			50 lines
		
	
	
	
		
			1.8 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			50 lines
		
	
	
	
		
			1.8 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| /* This Source Code Form is subject to the terms of the Mozilla Public
 | |
|  * License, v. 2.0. If a copy of the MPL was not distributed with this
 | |
|  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 | |
| 
 | |
| #ifndef MemMoveAnnotation_h__
 | |
| #define MemMoveAnnotation_h__
 | |
| 
 | |
| #include "CustomMatchers.h"
 | |
| #include "CustomTypeAnnotation.h"
 | |
| #include "Utils.h"
 | |
| 
 | |
| class MemMoveAnnotation final : public CustomTypeAnnotation {
 | |
| public:
 | |
|   MemMoveAnnotation()
 | |
|       : CustomTypeAnnotation("moz_non_memmovable", "non-memmove()able") {}
 | |
| 
 | |
|   virtual ~MemMoveAnnotation() {}
 | |
| 
 | |
| protected:
 | |
|   std::string getImplicitReason(const TagDecl *D) const override {
 | |
|     // Annotate everything in ::std, with a few exceptions; see bug
 | |
|     // 1201314 for discussion.
 | |
|     if (getDeclarationNamespace(D) == "std") {
 | |
|       // This doesn't check that it's really ::std::pair and not
 | |
|       // ::std::something_else::pair, but should be good enough.
 | |
|       StringRef Name = getNameChecked(D);
 | |
|       if (Name == "pair" || Name == "atomic" ||
 | |
|           // libstdc++ specific names
 | |
|           Name == "__atomic_base" || Name == "atomic_bool" ||
 | |
|           // MSVCRT specific names
 | |
|           Name == "_Atomic_impl" || Name == "_Atomic_base" ||
 | |
|           Name == "_Atomic_bool" || Name == "_Atomic_char" ||
 | |
|           Name == "_Atomic_schar" || Name == "_Atomic_uchar" ||
 | |
|           Name == "_Atomic_char16_t" || Name == "_Atomic_char32_t" ||
 | |
|           Name == "_Atomic_wchar_t" || Name == "_Atomic_short" ||
 | |
|           Name == "_Atomic_ushort" || Name == "_Atomic_int" ||
 | |
|           Name == "_Atomic_uint" || Name == "_Atomic_long" ||
 | |
|           Name == "_Atomic_ulong" || Name == "_Atomic_llong" ||
 | |
|           Name == "_Atomic_ullong" || Name == "_Atomic_address") {
 | |
|         return "";
 | |
|       }
 | |
|       return "it is an stl-provided type not guaranteed to be memmove-able";
 | |
|     }
 | |
|     return "";
 | |
|   }
 | |
| };
 | |
| 
 | |
| extern MemMoveAnnotation NonMemMovable;
 | |
| 
 | |
| #endif
 |