| namespace std { |
| |
| struct Traits { |
| typedef char char_type; |
| }; |
| |
| template<typename TraitsType> |
| struct BasicString { |
| typedef typename TraitsType::char_type value_type; |
| value_type value() const; |
| const value_type *data() const; |
| }; |
| |
| template<typename TraitsType> |
| BasicString<TraitsType> |
| operator+(const BasicString<TraitsType> &lhs, |
| const BasicString<TraitsType> &rhs); |
| template<typename TraitsType> |
| BasicString<TraitsType> |
| operator+(const BasicString<TraitsType> &lhs, |
| const char *rhs); |
| |
| template<typename TraitsType> |
| struct BasicString; |
| typedef BasicString<Traits> String; |
| |
| } // end namespace std |
| |
| void returnCharTypeNotUselessValueType() { |
| // CHECK1: "static char extracted(const std::String &x) {\nreturn x.value();\n}\n\n" [[@LINE-1]]:1 |
| // CHECK1: "static const char * extracted(const std::String &x) {\nreturn x.data();\n}\n\n" [[@LINE-2]]:1 |
| std::String x; |
| // return-char-begin: +1:9 |
| (void)x.value(); |
| // return-char-end: +0:1 |
| // return-data-begin: +1:9 |
| (void)x.data(); |
| // return-data-end: +0:1 |
| } // RUN: clang-refactor-test perform -action extract -selected=return-char -selected=return-data %s | FileCheck --check-prefix=CHECK1 %s |
| |
| void operatorTypeInferral() { |
| // CHECK2: "static std::String extracted(const std::String &x) {\nreturn x + "hello";\n}\n\n" [[@LINE-1]]:1 |
| // CHECK2: "static std::String extracted(const std::String &x) {\nreturn x + x;\n}\n\n" [[@LINE-2]]:1 |
| std::String x; |
| // infer-string1-begin: +1:10 |
| (void)(x + "hello"); |
| // infer-string1-end: -1:21 |
| // infer-string2-begin: +1:10 |
| (void)(x + x); |
| // infer-string2-end: -1:15 |
| } // RUN: clang-refactor-test perform -action extract -selected=infer-string1 -selected=infer-string2 %s | FileCheck --check-prefix=CHECK2 %s |