Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[BUG] NDK 27b cannot compile pythran #2084

Closed
licy183 opened this issue Oct 7, 2024 · 3 comments
Closed

[BUG] NDK 27b cannot compile pythran #2084

licy183 opened this issue Oct 7, 2024 · 3 comments
Assignees
Labels

Comments

@licy183
Copy link

licy183 commented Oct 7, 2024

Description

When compiling python-scikit-image, some error occurs. It has been reported to LLVM in llvm/llvm-project#76358, but this PR seems not to get included in NDK r27b.

FAILED: skimage/feature/brief_cy.cpython-312.so.p/meson-generated_.._brief_cy.cpp.o 
aarch64-linux-android-clang++ -Iskimage/feature/brief_cy.cpython-312.so.p -Iskimage/feature -I../src/skimage/feature -I/home/builder/.termux-build/python3.12-crossenv-prefix-bionic-aarch64/build/lib/python3.12/site-packages/pythran -I/data/data/com.termux/files/usr/lib/python3.12/site-packages/numpy/_core/include -I/data/data/com.termux/files/usr/include/python3.12 -I/data/data/com.termux/files/usr/include -fvisibility=hidden -fvisibility-inlines-hidden -fdiagnostics-color=always -DNDEBUG -D_FILE_OFFSET_BITS=64 -Wall -Winvalid-pch -std=c++14 -O3 -Wno-unused-function -fstack-protector-strong -Oz -fPIC -DENABLE_PYTHON_MODULE -D__PYTHRAN__=3 -DPYTHRAN_BLAS_NONE -MD -MQ skimage/feature/brief_cy.cpython-312.so.p/meson-generated_.._brief_cy.cpp.o -MF skimage/feature/brief_cy.cpython-312.so.p/meson-generated_.._brief_cy.cpp.o.d -o skimage/feature/brief_cy.cpython-312.so.p/meson-generated_.._brief_cy.cpp.o -c skimage/feature/brief_cy.cpp
In file included from skimage/feature/brief_cy.cpp:1:
In file included from /home/builder/.termux-build/python3.12-crossenv-prefix-bionic-aarch64/build/lib/python3.12/site-packages/pythran/pythonic/core.hpp:46:
In file included from /home/builder/.termux-build/python3.12-crossenv-prefix-bionic-aarch64/build/lib/python3.12/site-packages/pythran/pythonic/types/slice.hpp:5:
In file included from /home/builder/.termux-build/python3.12-crossenv-prefix-bionic-aarch64/build/lib/python3.12/site-packages/pythran/pythonic/types/NoneType.hpp:6:
In file included from /home/builder/.termux-build/python3.12-crossenv-prefix-bionic-aarch64/build/lib/python3.12/site-packages/pythran/pythonic/builtins/bool_.hpp:6:
In file included from /home/builder/.termux-build/python3.12-crossenv-prefix-bionic-aarch64/build/lib/python3.12/site-packages/pythran/pythonic/types/tuple.hpp:8:
In file included from /home/builder/.termux-build/python3.12-crossenv-prefix-bionic-aarch64/build/lib/python3.12/site-packages/pythran/pythonic/types/ndarray.hpp:4:
/home/builder/.termux-build/python3.12-crossenv-prefix-bionic-aarch64/build/lib/python3.12/site-packages/pythran/pythonic/include/types/ndarray.hpp:479:5: error: cannot overload a member function without a ref-qualifier with a member function with ref-qualifier '&&'
  479 |     operator[](F const &filter) const;
      |     ^
/home/builder/.termux-build/python3.12-crossenv-prefix-bionic-aarch64/build/lib/python3.12/site-packages/pythran/pythonic/include/types/ndarray.hpp:438:5: note: previous declaration is here
  438 |     operator[](S const &s) &&;
      |     ^
/home/builder/.termux-build/python3.12-crossenv-prefix-bionic-aarch64/build/lib/python3.12/site-packages/pythran/pythonic/include/types/ndarray.hpp:495:5: error: cannot overload a member function without a ref-qualifier with a member function with ref-qualifier '&&'
  495 |     operator[](F const &filter) const;
      |     ^
/home/builder/.termux-build/python3.12-crossenv-prefix-bionic-aarch64/build/lib/python3.12/site-packages/pythran/pythonic/include/types/ndarray.hpp:438:5: note: previous declaration is here
  438 |     operator[](S const &s) &&;
      |     ^
/home/builder/.termux-build/python3.12-crossenv-prefix-bionic-aarch64/build/lib/python3.12/site-packages/pythran/pythonic/include/types/ndarray.hpp:503:5: error: cannot overload a member function without a ref-qualifier with a member function with ref-qualifier '&&'
  503 |     operator[](F const &filter) const;
      |     ^
/home/builder/.termux-build/python3.12-crossenv-prefix-bionic-aarch64/build/lib/python3.12/site-packages/pythran/pythonic/include/types/ndarray.hpp:438:5: note: previous declaration is here
  438 |     operator[](S const &s) &&;
      |     ^
/home/builder/.termux-build/python3.12-crossenv-prefix-bionic-aarch64/build/lib/python3.12/site-packages/pythran/pythonic/include/types/ndarray.hpp:479:5: error: cannot overload a member function without a ref-qualifier with a member function with ref-qualifier '&&'
  479 |     operator[](F const &filter) const;
      |     ^
/home/builder/.termux-build/python3.12-crossenv-prefix-bionic-aarch64/build/lib/python3.12/site-packages/pythran/pythonic/types/numpy_expr.hpp:326:9: note: in instantiation of template class '(anonymous namespace)::pythonic::types::ndarray<long, (anonymous namespace)::pythonic::types::pshape<long>>' requested here
  326 |         ndarray<long, pshape<long>>(raw, shp, types::ownership::owned));
      |         ^
/home/builder/.termux-build/python3.12-crossenv-prefix-bionic-aarch64/build/lib/python3.12/site-packages/pythran/pythonic/include/types/ndarray.hpp:438:5: note: previous declaration is here
  438 |     operator[](S const &s) &&;
      |     ^
/home/builder/.termux-build/python3.12-crossenv-prefix-bionic-aarch64/build/lib/python3.12/site-packages/pythran/pythonic/include/types/ndarray.hpp:495:5: error: cannot overload a member function without a ref-qualifier with a member function with ref-qualifier '&&'
  495 |     operator[](F const &filter) const;
      |     ^
/home/builder/.termux-build/python3.12-crossenv-prefix-bionic-aarch64/build/lib/python3.12/site-packages/pythran/pythonic/include/types/ndarray.hpp:438:5: note: previous declaration is here
  438 |     operator[](S const &s) &&;
      |     ^
/home/builder/.termux-build/python3.12-crossenv-prefix-bionic-aarch64/build/lib/python3.12/site-packages/pythran/pythonic/include/types/ndarray.hpp:503:5: error: cannot overload a member function without a ref-qualifier with a member function with ref-qualifier '&&'
  503 |     operator[](F const &filter) const;
      |     ^
/home/builder/.termux-build/python3.12-crossenv-prefix-bionic-aarch64/build/lib/python3.12/site-packages/pythran/pythonic/include/types/ndarray.hpp:438:5: note: previous declaration is here
  438 |     operator[](S const &s) &&;
      |     ^
In file included from skimage/feature/brief_cy.cpp:1:
In file included from /home/builder/.termux-build/python3.12-crossenv-prefix-bionic-aarch64/build/lib/python3.12/site-packages/pythran/pythonic/core.hpp:46:
In file included from /home/builder/.termux-build/python3.12-crossenv-prefix-bionic-aarch64/build/lib/python3.12/site-packages/pythran/pythonic/types/slice.hpp:5:
In file included from /home/builder/.termux-build/python3.12-crossenv-prefix-bionic-aarch64/build/lib/python3.12/site-packages/pythran/pythonic/types/NoneType.hpp:6:
In file included from /home/builder/.termux-build/python3.12-crossenv-prefix-bionic-aarch64/build/lib/python3.12/site-packages/pythran/pythonic/builtins/bool_.hpp:6:
In file included from /home/builder/.termux-build/python3.12-crossenv-prefix-bionic-aarch64/build/lib/python3.12/site-packages/pythran/pythonic/types/tuple.hpp:8:
/home/builder/.termux-build/python3.12-crossenv-prefix-bionic-aarch64/build/lib/python3.12/site-packages/pythran/pythonic/types/ndarray.hpp:792:19: error: cannot overload a member function without a ref-qualifier with a member function with ref-qualifier '&&'
  792 |   ndarray<T, pS>::operator[](F const &filter) const
      |                   ^
/home/builder/.termux-build/python3.12-crossenv-prefix-bionic-aarch64/build/lib/python3.12/site-packages/pythran/pythonic/types/ndarray.hpp:724:19: note: previous declaration is here
  724 |   ndarray<T, pS>::operator[](S const &s) &&
      |                   ^
/home/builder/.termux-build/python3.12-crossenv-prefix-bionic-aarch64/build/lib/python3.12/site-packages/pythran/pythonic/types/ndarray.hpp:816:19: error: cannot overload a member function without a ref-qualifier with a member function with ref-qualifier '&&'
  816 |   ndarray<T, pS>::operator[](F const &filter) const
      |                   ^
/home/builder/.termux-build/python3.12-crossenv-prefix-bionic-aarch64/build/lib/python3.12/site-packages/pythran/pythonic/types/ndarray.hpp:724:19: note: previous declaration is here
  724 |   ndarray<T, pS>::operator[](S const &s) &&
      |                   ^
/home/builder/.termux-build/python3.12-crossenv-prefix-bionic-aarch64/build/lib/python3.12/site-packages/pythran/pythonic/types/ndarray.hpp:828:19: error: cannot overload a member function without a ref-qualifier with a member function with ref-qualifier '&&'
  828 |   ndarray<T, pS>::operator[](F const &filter) const
      |                   ^
/home/builder/.termux-build/python3.12-crossenv-prefix-bionic-aarch64/build/lib/python3.12/site-packages/pythran/pythonic/types/ndarray.hpp:724:19: note: previous declaration is here
  724 |   ndarray<T, pS>::operator[](S const &s) &&
      |                   ^
In file included from skimage/feature/brief_cy.cpp:1:
In file included from /home/builder/.termux-build/python3.12-crossenv-prefix-bionic-aarch64/build/lib/python3.12/site-packages/pythran/pythonic/core.hpp:46:
In file included from /home/builder/.termux-build/python3.12-crossenv-prefix-bionic-aarch64/build/lib/python3.12/site-packages/pythran/pythonic/types/slice.hpp:5:
In file included from /home/builder/.termux-build/python3.12-crossenv-prefix-bionic-aarch64/build/lib/python3.12/site-packages/pythran/pythonic/types/NoneType.hpp:6:
In file included from /home/builder/.termux-build/python3.12-crossenv-prefix-bionic-aarch64/build/lib/python3.12/site-packages/pythran/pythonic/builtins/bool_.hpp:6:
In file included from /home/builder/.termux-build/python3.12-crossenv-prefix-bionic-aarch64/build/lib/python3.12/site-packages/pythran/pythonic/types/tuple.hpp:8:
In file included from /home/builder/.termux-build/python3.12-crossenv-prefix-bionic-aarch64/build/lib/python3.12/site-packages/pythran/pythonic/types/ndarray.hpp:4:
/home/builder/.termux-build/python3.12-crossenv-prefix-bionic-aarch64/build/lib/python3.12/site-packages/pythran/pythonic/include/types/ndarray.hpp:479:5: error: cannot overload a member function without a ref-qualifier with a member function with ref-qualifier '&&'
  479 |     operator[](F const &filter) const;
      |     ^
skimage/feature/brief_cy.cpp:49:26: note: in instantiation of template class '(anonymous namespace)::pythonic::types::ndarray<int, (anonymous namespace)::pythonic::types::pshape<long, std::integral_constant<long, 2>>>' requested here
   49 |         typedef decltype(pythonic::types::as_const(std::declval<__type1>())) __type2;
      |                          ^
skimage/feature/brief_cy.cpp:134:43: note: in instantiation of template class '(anonymous namespace)::__pythran_brief_cy::_brief_loop::type<(anonymous namespace)::pythonic::types::ndarray<float, (anonymous namespace)::pythonic::types::pshape<long, long>>, (anonymous namespace)::pythonic::types::ndarray<unsigned char, (anonymous namespace)::pythonic::types::pshape<long, long>>, (anonymous namespace)::pythonic::types::ndarray<long, (anonymous namespace)::pythonic::types::pshape<long, std::integral_constant<long, 2>>>, (anonymous namespace)::pythonic::types::ndarray<int, (anonymous namespace)::pythonic::types::pshape<long, std::integral_constant<long, 2>>>, (anonymous namespace)::pythonic::types::ndarray<int, (anonymous namespace)::pythonic::types::pshape<long, std::integral_constant<long, 2>>>>' requested here
  134 | typename __pythran_brief_cy::_brief_loop::type<pythonic::types::ndarray<float,pythonic::types::pshape<long,long>>, pythonic::types::ndarray<npy_uint8,pythonic::types::pshape<long,long>>, pythonic::types::ndarray<npy_int64,pythonic::types::pshape<long,std::integral_constant<long, 2>>>, pythonic::types::ndarray<npy_int32,pythonic::types::pshape<long,std::integral_constant<long, 2>>>, pythonic::types::ndarray<npy_int32,pythonic::types::pshape<long,std::integral_constant<long, 2>>>>::result_type _brief_loop0(pythonic::types::ndarray<float,pythonic::types::pshape<long,long>>&& image, pythonic::types::ndarray<npy_uint8,pythonic::types::pshape<long,long>>&& descriptors, pythonic::types::ndarray<npy_int64,pythonic::types::pshape<long,std::integral_constant<long, 2>>>&& keypoints, pythonic::types::ndarray<npy_int32,pythonic::types::pshape<long,std::integral_constant<long, 2>>>&& pos0, pythonic::types::ndarray<npy_int32,pythonic::types::pshape<long,std::integral_constant<long, 2>>>&& pos1) 
      |                                           ^
/home/builder/.termux-build/python3.12-crossenv-prefix-bionic-aarch64/build/lib/python3.12/site-packages/pythran/pythonic/include/types/ndarray.hpp:438:5: note: previous declaration is here
  438 |     operator[](S const &s) &&;
      |     ^
/home/builder/.termux-build/python3.12-crossenv-prefix-bionic-aarch64/build/lib/python3.12/site-packages/pythran/pythonic/include/types/ndarray.hpp:495:5: error: cannot overload a member function without a ref-qualifier with a member function with ref-qualifier '&&'
  495 |     operator[](F const &filter) const;
      |     ^
/home/builder/.termux-build/python3.12-crossenv-prefix-bionic-aarch64/build/lib/python3.12/site-packages/pythran/pythonic/include/types/ndarray.hpp:438:5: note: previous declaration is here
  438 |     operator[](S const &s) &&;
      |     ^
/home/builder/.termux-build/python3.12-crossenv-prefix-bionic-aarch64/build/lib/python3.12/site-packages/pythran/pythonic/include/types/ndarray.hpp:503:5: error: cannot overload a member function without a ref-qualifier with a member function with ref-qualifier '&&'
  503 |     operator[](F const &filter) const;
      |     ^
/home/builder/.termux-build/python3.12-crossenv-prefix-bionic-aarch64/build/lib/python3.12/site-packages/pythran/pythonic/include/types/ndarray.hpp:438:5: note: previous declaration is here
  438 |     operator[](S const &s) &&;
      |     ^
/home/builder/.termux-build/python3.12-crossenv-prefix-bionic-aarch64/build/lib/python3.12/site-packages/pythran/pythonic/include/types/ndarray.hpp:479:5: error: cannot overload a member function without a ref-qualifier with a member function with ref-qualifier '&&'
  479 |     operator[](F const &filter) const;
      |     ^
skimage/feature/brief_cy.cpp:68:26: note: in instantiation of template class '(anonymous namespace)::pythonic::types::ndarray<long, (anonymous namespace)::pythonic::types::pshape<long, std::integral_constant<long, 2>>>' requested here
   68 |         typedef decltype(pythonic::types::as_const(std::declval<__type22>())) __type23;
      |                          ^
skimage/feature/brief_cy.cpp:134:43: note: in instantiation of template class '(anonymous namespace)::__pythran_brief_cy::_brief_loop::type<(anonymous namespace)::pythonic::types::ndarray<float, (anonymous namespace)::pythonic::types::pshape<long, long>>, (anonymous namespace)::pythonic::types::ndarray<unsigned char, (anonymous namespace)::pythonic::types::pshape<long, long>>, (anonymous namespace)::pythonic::types::ndarray<long, (anonymous namespace)::pythonic::types::pshape<long, std::integral_constant<long, 2>>>, (anonymous namespace)::pythonic::types::ndarray<int, (anonymous namespace)::pythonic::types::pshape<long, std::integral_constant<long, 2>>>, (anonymous namespace)::pythonic::types::ndarray<int, (anonymous namespace)::pythonic::types::pshape<long, std::integral_constant<long, 2>>>>' requested here
  134 | typename __pythran_brief_cy::_brief_loop::type<pythonic::types::ndarray<float,pythonic::types::pshape<long,long>>, pythonic::types::ndarray<npy_uint8,pythonic::types::pshape<long,long>>, pythonic::types::ndarray<npy_int64,pythonic::types::pshape<long,std::integral_constant<long, 2>>>, pythonic::types::ndarray<npy_int32,pythonic::types::pshape<long,std::integral_constant<long, 2>>>, pythonic::types::ndarray<npy_int32,pythonic::types::pshape<long,std::integral_constant<long, 2>>>>::result_type _brief_loop0(pythonic::types::ndarray<float,pythonic::types::pshape<long,long>>&& image, pythonic::types::ndarray<npy_uint8,pythonic::types::pshape<long,long>>&& descriptors, pythonic::types::ndarray<npy_int64,pythonic::types::pshape<long,std::integral_constant<long, 2>>>&& keypoints, pythonic::types::ndarray<npy_int32,pythonic::types::pshape<long,std::integral_constant<long, 2>>>&& pos0, pythonic::types::ndarray<npy_int32,pythonic::types::pshape<long,std::integral_constant<long, 2>>>&& pos1) 
      |                                           ^
/home/builder/.termux-build/python3.12-crossenv-prefix-bionic-aarch64/build/lib/python3.12/site-packages/pythran/pythonic/include/types/ndarray.hpp:438:5: note: previous declaration is here
  438 |     operator[](S const &s) &&;
      |     ^
/home/builder/.termux-build/python3.12-crossenv-prefix-bionic-aarch64/build/lib/python3.12/site-packages/pythran/pythonic/include/types/ndarray.hpp:495:5: error: cannot overload a member function without a ref-qualifier with a member function with ref-qualifier '&&'
  495 |     operator[](F const &filter) const;
      |     ^
/home/builder/.termux-build/python3.12-crossenv-prefix-bionic-aarch64/build/lib/python3.12/site-packages/pythran/pythonic/include/types/ndarray.hpp:438:5: note: previous declaration is here
  438 |     operator[](S const &s) &&;
      |     ^
/home/builder/.termux-build/python3.12-crossenv-prefix-bionic-aarch64/build/lib/python3.12/site-packages/pythran/pythonic/include/types/ndarray.hpp:503:5: error: cannot overload a member function without a ref-qualifier with a member function with ref-qualifier '&&'
  503 |     operator[](F const &filter) const;
      |     ^
/home/builder/.termux-build/python3.12-crossenv-prefix-bionic-aarch64/build/lib/python3.12/site-packages/pythran/pythonic/include/types/ndarray.hpp:438:5: note: previous declaration is here
  438 |     operator[](S const &s) &&;
      |     ^
/home/builder/.termux-build/python3.12-crossenv-prefix-bionic-aarch64/build/lib/python3.12/site-packages/pythran/pythonic/include/types/ndarray.hpp:479:5: error: cannot overload a member function without a ref-qualifier with a member function with ref-qualifier '&&'
  479 |     operator[](F const &filter) const;
      |     ^
skimage/feature/brief_cy.cpp:139:78: note: in instantiation of template class '(anonymous namespace)::pythonic::types::ndarray<float, (anonymous namespace)::pythonic::types::pshape<long, long>>' requested here
  139 |                                 auto res = __pythran_brief_cy::_brief_loop()(image, descriptors, keypoints, pos0, pos1);
      |                                                                              ^
/home/builder/.termux-build/python3.12-crossenv-prefix-bionic-aarch64/build/lib/python3.12/site-packages/pythran/pythonic/include/types/ndarray.hpp:438:5: note: previous declaration is here
  438 |     operator[](S const &s) &&;
      |     ^
/home/builder/.termux-build/python3.12-crossenv-prefix-bionic-aarch64/build/lib/python3.12/site-packages/pythran/pythonic/include/types/ndarray.hpp:495:5: error: cannot overload a member function without a ref-qualifier with a member function with ref-qualifier '&&'
  495 |     operator[](F const &filter) const;
      |     ^
/home/builder/.termux-build/python3.12-crossenv-prefix-bionic-aarch64/build/lib/python3.12/site-packages/pythran/pythonic/include/types/ndarray.hpp:438:5: note: previous declaration is here
  438 |     operator[](S const &s) &&;
      |     ^
/home/builder/.termux-build/python3.12-crossenv-prefix-bionic-aarch64/build/lib/python3.12/site-packages/pythran/pythonic/include/types/ndarray.hpp:503:5: error: cannot overload a member function without a ref-qualifier with a member function with ref-qualifier '&&'
  503 |     operator[](F const &filter) const;
      |     ^
/home/builder/.termux-build/python3.12-crossenv-prefix-bionic-aarch64/build/lib/python3.12/site-packages/pythran/pythonic/include/types/ndarray.hpp:438:5: note: previous declaration is here
  438 |     operator[](S const &s) &&;
      |     ^
/home/builder/.termux-build/python3.12-crossenv-prefix-bionic-aarch64/build/lib/python3.12/site-packages/pythran/pythonic/include/types/ndarray.hpp:479:5: error: cannot overload a member function without a ref-qualifier with a member function with ref-qualifier '&&'
  479 |     operator[](F const &filter) const;
      |     ^
skimage/feature/brief_cy.cpp:139:85: note: in instantiation of template class '(anonymous namespace)::pythonic::types::ndarray<unsigned char, (anonymous namespace)::pythonic::types::pshape<long, long>>' requested here
  139 |                                 auto res = __pythran_brief_cy::_brief_loop()(image, descriptors, keypoints, pos0, pos1);
      |                                                                                     ^
/home/builder/.termux-build/python3.12-crossenv-prefix-bionic-aarch64/build/lib/python3.12/site-packages/pythran/pythonic/include/types/ndarray.hpp:438:5: note: previous declaration is here
  438 |     operator[](S const &s) &&;
      |     ^
fatal error: too many errors emitted, stopping now [-ferror-limit=]

Upstream bug

llvm/llvm-project#76358

Commit to cherry-pick

llvm/llvm-project@69066ab

Affected versions

r27

Canary version

No response

Host OS

Linux

Host OS version

Ubuntu 24.04

Affected ABIs

armeabi-v7a, arm64-v8a, x86, x86_64

Build system

Meson

minSdkVersion

24

Device API level

No response

@licy183 licy183 added the bug label Oct 7, 2024
@pirama-arumuga-nainar
Copy link
Collaborator

Thanks for identifying the llvm-project bug and fix. r.android.com/3297280 to pick it to r27c.

@pirama-arumuga-nainar pirama-arumuga-nainar self-assigned this Oct 7, 2024
@github-project-automation github-project-automation bot moved this to Unconfirmed in NDK r27c Oct 7, 2024
@DanAlbert
Copy link
Member

@pirama-arumuga-nainar just confirming: r28 not affected, right? The fix is from January so I assume not :)

@DanAlbert DanAlbert added this to LLVM Oct 7, 2024
@github-project-automation github-project-automation bot moved this to Awaiting triage in LLVM Oct 7, 2024
@DanAlbert DanAlbert moved this from Awaiting triage to Awaiting update in LLVM Oct 7, 2024
@DanAlbert DanAlbert moved this from Unconfirmed to Needs prebuilt update in NDK r27c Oct 7, 2024
@pirama-arumuga-nainar
Copy link
Collaborator

@DanAlbert correct, r28 should already have the fix.

@DanAlbert DanAlbert moved this from Needs prebuilt update to Merged in NDK r27c Oct 11, 2024
@DanAlbert DanAlbert moved this from Awaiting update to Prebuilts submitted in LLVM Oct 11, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
Status: Prebuilts submitted
Status: Merged
Development

No branches or pull requests

3 participants