Skip to content

~bool deprecation not reported for literals #134280

Open
@decorator-factory

Description

@decorator-factory

Bug report

Bug description:

Related to: #103487

# literal.py
print(~False)
print(~True)

# var.py
a = True
print(~a)

b = False
print(~b)

A DeprecationWarning is reported for var.py, but not for literal.py.

$ python -c 'import sys; print(sys.version)'
3.15.0a0 (heads/main:42d03f3, May 19 2025, 23:32:01) [GCC 15.1.1 20250425 (Red Hat 15.1.1-1)]

$ python literal.py
-1
-2

$ python var.py
/tmp/scratch/var.py:2: DeprecationWarning: Bitwise inversion '~' on bool is deprecated and will be removed in Python 3.16. This returns the bitwise inversion of the underlying int object and is usually not what you expect from negating a bool. Use the 'not' operator for boolean negation or ~int(x) if you really want the bitwise inversion of the underlying int.
  print(~a)
-2
/tmp/scratch/var.py:5: DeprecationWarning: Bitwise inversion '~' on bool is deprecated and will be removed in Python 3.16. This returns the bitwise inversion of the underlying int object and is usually not what you expect from negating a bool. Use the 'not' operator for boolean negation or ~int(x) if you really want the bitwise inversion of the underlying int.
  print(~b)
-1

What's interesting is that there's a test for this:

with self.assertWarns(DeprecationWarning):
# also check that the warning is issued in case of constant
# folding at compile time
self.assertEqual(eval("~False"), -1)
and the DeprecationWarning is raised if eval("~True") is used instead of just ~True

$ python -c 'print(~True)'
-2
$ python -c 'print(eval("~True"))'
<string>:1: DeprecationWarning: Bitwise inversion '~' on bool is deprecated and will be removed in Python 3.16. This returns the bitwise inversion of the underlying int object and is usually not what you expect from negating a bool. Use the 'not' operator for boolean negation or ~int(x) if you really want the bitwise inversion of the underlying int.
-2

CPython versions tested on:

CPython main branch, 3.13

Operating systems tested on:

Linux

Linked PRs

Activity

StanFromIreland

StanFromIreland commented on May 19, 2025

@StanFromIreland
Contributor

It seems to warn for me on 3.15 and 3.14:

$ python3.15 -c 'print(~True)'
<sys>:0: DeprecationWarning: Bitwise inversion '~' on bool is deprecated and will be removed in Python 3.16. This returns the bitwise inversion of the underlying int object and is usually not what you expect from negating a bool. Use the 'not' operator for boolean negation or ~int(x) if you really want the bitwise inversion of the underlying int.
-2

This is 3.13 only.

decorator-factory

decorator-factory commented on May 19, 2025

@decorator-factory
ContributorAuthor

@StanFromIreland I ran it in a container (https://hub.docker.com/_/python/) on 3.14 for reproducibility:

$ podman run -ti --rm python:3.14.0b1-slim bash
root@a9edb8be24cb:/# python -c 'print(~True)'
-2
root@a9edb8be24cb:/# python -c 'print(eval("~True"))'
<string>:1: DeprecationWarning: Bitwise inversion '~' on bool is deprecated and will be removed in Python 3.16. This returns the bitwise inversion of the underlying int object and is usually not what you expect from negating a bool. Use the 'not' operator for boolean negation or ~int(x) if you really want the bitwise inversion of the underlying int.
-2
root@a9edb8be24cb:/# python
Python 3.14.0b1 (main, May  9 2025, 23:49:24) [GCC 12.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> ~True
-2
>>> ~False
-1
>>>

On 3.15 in debug mode, I do get a warning:

$ ./configure --with-pydebug
...
$ make -j 12
...
$ ./python -c 'print(~True)'
<sys>:0: DeprecationWarning: Bitwise inversion '~' on bool is deprecated and will be removed in Python 3.16. This returns the bitwise inversion of the underlying int object and is usually not what you expect from negating a bool. Use the 'not' operator for boolean negation or ~int(x) if you really want the bitwise inversion of the underlying int.
-2
$ ./python
Python 3.15.0a0 (heads/main:42d03f3, May 20 2025, 00:35:04) [GCC 15.1.1 20250425 (Red Hat 15.1.1-1)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> ~True
/home/df/clones/cpython/Lib/codeop.py:117: DeprecationWarning: Bitwise inversion '~' on bool is deprecated and will be removed in Python 3.16. This returns the bitwise inversion of the underlying int object and is usually not what you expect from negating a bool. Use the 'not' operator for boolean negation or ~int(x) if you really want the bitwise inversion of the underlying int.
  codeob = compile(source, filename, symbol, flags, True)
-2
>>>

EDIT: seems like the warning is displayed in 3.13 and 3.14 if the -X dev flag is enabled

added
3.13bugs and security fixes
3.14bugs and security fixes
3.15new features, bugs and security fixes
on May 20, 2025
AA-Turner

AA-Turner commented on May 20, 2025

@AA-Turner
Member
timhoffm

timhoffm commented on May 20, 2025

@timhoffm
Contributor

I will look into this.

serhiy-storchaka

serhiy-storchaka commented on May 31, 2025

@serhiy-storchaka
Member

This works as intended. By default, DeprecationWarning is only reported for the __main__ module in the Python development mode or in the debug build.

Run Python with -W always or -X dev to see them.

decorator-factory

decorator-factory commented on May 31, 2025

@decorator-factory
ContributorAuthor

So in this case, the operation is considered to be in the __main__ module

if __name__ == "__main__":
    a = True
    print(~a)  # prints -2, with DeprecationWarning

but here it's considered to be outside of __main__?

if __name__ == "__main__":
    print(~True)  # prints -2, no DeprecationWarning

(from the docs (https://docs.python.org/3/library/exceptions.html#DeprecationWarning) and PEP 565 I'm assuming that you meant that deprecation warnings are only active in __main__ by default

default::DeprecationWarning:__main__
ignore::DeprecationWarning
ignore::PendingDeprecationWarning
ignore::ImportWarning
ignore::BytesWarning
ignore::ResourceWarning

)

serhiy-storchaka

serhiy-storchaka commented on May 31, 2025

@serhiy-storchaka
Member

Well, this is obviously related to the fact that ~True is calculated at the compile time.

If warnings are ignored in the constant folding, this is a bug.

removed
pendingThe issue will be closed if no feedback is provided
on May 31, 2025

3 remaining items

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Labels

3.13bugs and security fixes3.14bugs and security fixes3.15new features, bugs and security fixesinterpreter-core(Objects, Python, Grammar, and Parser dirs)type-bugAn unexpected behavior, bug, or error

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions

    `~bool` deprecation not reported for literals · Issue #134280 · python/cpython

    Follow Lee on X/Twitter - Father, Husband, Serial builder creating AI, crypto, games & web tools. We are friends :) AI Will Come To Life!

    Check out: eBank.nz (Art Generator) | Netwrck.com (AI Tools) | Text-Generator.io (AI API) | BitBank.nz (Crypto AI) | ReadingTime (Kids Reading) | RewordGame | BigMultiplayerChess | WebFiddle | How.nz | Helix AI Assistant