aboutsummaryrefslogtreecommitdiff
path: root/tools/clang/rewrite_to_chrome_style/tests/template-original.cc
diff options
context:
space:
mode:
Diffstat (limited to 'tools/clang/rewrite_to_chrome_style/tests/template-original.cc')
-rw-r--r--tools/clang/rewrite_to_chrome_style/tests/template-original.cc223
1 files changed, 219 insertions, 4 deletions
diff --git a/tools/clang/rewrite_to_chrome_style/tests/template-original.cc b/tools/clang/rewrite_to_chrome_style/tests/template-original.cc
index 561fec42..47aef5d8 100644
--- a/tools/clang/rewrite_to_chrome_style/tests/template-original.cc
+++ b/tools/clang/rewrite_to_chrome_style/tests/template-original.cc
@@ -2,6 +2,8 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
+#include <type_traits>
+
namespace not_blink {
void function(int x) {}
@@ -9,6 +11,7 @@ void function(int x) {}
class Class {
public:
void method() {}
+ virtual void virtualMethod() {}
template <typename T>
void methodTemplate(T) {}
template <typename T>
@@ -18,24 +21,94 @@ class Class {
template <typename T>
void functionTemplate(T x) {}
+template <typename T = Class>
+void functionTemplate2() {
+ T::staticMethodTemplate(123);
+}
+
+template <typename T = Class>
+class TemplatedClass {
+ public:
+ void anotherMethod() { T::staticMethodTemplate(123); }
+};
+
} // not_blink
namespace blink {
+bool functionNotMarkedConstexpr(int a) {
+ return a == 4 || a == 10;
+}
+
+template <typename T>
+bool templatedFunctionNotMarkedConstexpr(T t) {
+ return !!t;
+}
+
+int g_globalNumber;
+
template <typename T, int number>
void F() {
- // We don't assert on this, and we don't end up considering it a const for
- // now.
+ // These are const but hacker_case so we leave them alone.
const int maybe_a_const = sizeof(T);
const int is_a_const = number;
+ // These are const expressions so they get a k prefix.
+ const int maybeAConstToo = sizeof(T);
+ const int isAConstToo = number;
+ // These are built from calls to functions which produces inconsistent
+ // results so they should not be considered const to be safe.
+ const bool fromAMethod = functionNotMarkedConstexpr(number);
+ const bool fromATemplatedMethod = templatedFunctionNotMarkedConstexpr(number);
+ // A complex statement of const things is const.
+ const bool complexConst = number || (number + 1);
+ // A complex statement with a non-const thing is not const.
+ const bool complexNotConst = number || (g_globalNumber + 1);
+ // A const built from other consts is a const.
+ const bool constFromAConst = complexConst || number;
}
template <int number, typename... T>
void F() {
- // We don't assert on this, and we don't end up considering it a const for
- // now.
+ // These are const but hacker_case so we leave them alone.
const int maybe_a_const = sizeof...(T);
const int is_a_const = number;
+ // These are const expressions so they get a k prefix.
+ const int maybeAConstToo = sizeof...(T);
+ const int isAConstToo = number;
+}
+
+namespace test_member_in_template {
+
+template <typename T>
+class HasAMember {
+ public:
+ HasAMember() {}
+ HasAMember(const T&) {}
+
+ void usesMember() { const int notConst = m_i; }
+ void alsoUsesMember();
+
+ private:
+ int m_i;
+};
+
+template <typename T>
+void HasAMember<T>::alsoUsesMember() {
+ const int notConst = m_i;
+}
+
+template <typename T>
+static void basedOnSubType(const HasAMember<T>& t) {
+ const HasAMember<T> problematicNotConst(t);
+}
+
+void Run() {
+ HasAMember<int>().usesMember();
+
+ basedOnSubType<int>(HasAMember<int>());
+ enum E { A };
+ basedOnSubType<E>(HasAMember<E>());
+}
}
namespace test_template_arg_is_function {
@@ -52,6 +125,15 @@ void test() {
h<int, f>(0);
// Non-Blink should stay the same.
h<int, not_blink::function>(1);
+
+ // The int one makes the methods called from F() considered as constexpr, and
+ // can be collapsed to not have template arguments before it reaches the AST.
+ F<int, 10>();
+ // The enum one makes them not constexpr, as it doesn't collapse away the
+ // template stuff as much. This can lead to conflicting decisions about
+ // the names inside F() vs the above instantiation.
+ enum E { A };
+ F<E, 11>();
}
} // namespace test_template_arg_is_function
@@ -119,6 +201,25 @@ void test() {
} // test_template_arg_is_method_template_in_non_member_context
+namespace test_inherited_field {
+
+template <typename T>
+class BaseClass {
+ public:
+ unsigned long m_size;
+};
+
+template <typename T>
+class DerivedClass : protected BaseClass<T> {
+ private:
+ using Base = BaseClass<T>;
+ // https://crbug.com/640016: Need to rewrite |m_size| into |size_|.
+ using Base::m_size;
+ void method() { m_size = 123; }
+};
+
+} // namespace test_inherited_field
+
namespace test_template_arg_is_method_template_in_member_context {
struct Class {
@@ -161,4 +262,118 @@ void foo() {
} // namespace test_unnamed_arg
+namespace cxx_dependent_scope_member_expr_testing {
+
+class PartitionAllocator {
+ public:
+ static void method() {}
+};
+
+template <typename Allocator = PartitionAllocator>
+class Vector {
+ public:
+ // https://crbug.com/582315: |Allocator::method| is a
+ // CXXDependentScopeMemberExpr.
+ void anotherMethod() {
+ if (std::is_class<Allocator>::value) // Shouldn't rename |value|
+ Allocator::method(); // Should rename |method| -> |Method|.
+ }
+};
+
+template <typename Allocator = PartitionAllocator>
+void test() {
+ // https://crbug.com/582315: |Allocator::method| is a
+ // DependentScopeDeclRefExpr.
+ if (std::is_class<Allocator>::value) // Shouldn't rename |value|.
+ Allocator::method(); // Should rename |method|.
+}
+
+class InterceptingCanvasBase : public ::not_blink::Class {
+ public:
+ virtual void virtualMethodInBlink(){};
+};
+
+template <typename DerivedCanvas>
+class InterceptingCanvas : public InterceptingCanvasBase {
+ public:
+ void virtualMethod() override {
+ this->Class::virtualMethod(); // https://crbug.com/582315#c19
+ this->InterceptingCanvasBase::virtualMethodInBlink();
+ }
+};
+
+template <typename T>
+class ThreadSpecific {
+ public:
+ T* operator->();
+ operator T*();
+};
+
+template <typename T>
+inline ThreadSpecific<T>::operator T*() {
+ return nullptr;
+}
+
+template <typename T>
+inline T* ThreadSpecific<T>::operator->() {
+ return operator T*();
+}
+
+class Class {
+ public:
+ virtual void virtualMethodInBlink() {}
+};
+
+} // namespace cxx_dependent_scope_member_expr_testing
+
+namespace blacklisting_of_renaming_of_begin_method {
+
+template <typename T>
+class IntrusiveHeap {
+ public:
+ // https://crbug.com/672353: |begin| shouldn't be rewritten to |Begin|.
+ const T* begin() const { return nullptr; }
+};
+
+} // namespace blacklisting_of_renaming_of_begin_method
+
} // namespace blink
+
+namespace not_blink {
+
+namespace cxx_dependent_scope_member_expr_testing {
+
+class Base : public ::blink::cxx_dependent_scope_member_expr_testing::Class {
+ public:
+ virtual void virtualMethod() {}
+};
+
+template <typename T>
+class Derived : public Base {
+ public:
+ void virtualMethod() override {
+ this->Class::virtualMethodInBlink();
+ this->Base::virtualMethod();
+ }
+};
+
+} // namespace cxx_dependent_scope_member_expr_testing
+
+namespace blink_methods_called_from_mojo_traits_are_not_rewritten {
+
+template <typename V>
+struct MapTraits;
+
+template <typename V>
+struct MapTraits<blink::test_unnamed_arg::Class<V>> {
+ static void SetToEmpty(blink::test_unnamed_arg::Class<V>* output) {
+ // Need to rewrite |f| to |F| below (because this method name
+ // does get rewritten when processing blink::test_unnamed_arg::Class).
+ // See also https://crbug.com/670434.
+ output->f(123);
+ }
+};
+
+} // namespace blink_methods_called_from_mojo_traits_are_not_rewritten
+
+} // namespace not_blink