diff options
author | Gauthier Harnisch <tyker1@outlook.com> | 2019-06-15 08:32:56 +0000 |
---|---|---|
committer | Gauthier Harnisch <tyker1@outlook.com> | 2019-06-15 08:32:56 +0000 |
commit | 0bb4d46b2be5edd58621416de72e995cd6dd7ec4 (patch) | |
tree | ccc668ec1d20d2bd9c70d87d7d9a0801c853a385 /llvm/lib/Support/BranchProbability.cpp | |
parent | e1aa69f75574b88ac18fbe683af39226ee5ad288 (diff) | |
download | llvm-0bb4d46b2be5edd58621416de72e995cd6dd7ec4.zip llvm-0bb4d46b2be5edd58621416de72e995cd6dd7ec4.tar.gz llvm-0bb4d46b2be5edd58621416de72e995cd6dd7ec4.tar.bz2 |
[clang] perform semantic checking in constant context
Summary:
Since the addition of __builtin_is_constant_evaluated the result of an expression can change based on whether it is evaluated in constant context. a lot of semantic checking performs evaluations with out specifying context. which can lead to wrong diagnostics.
for example:
```
constexpr int i0 = (long long)__builtin_is_constant_evaluated() * (1ll << 33); //#1
constexpr int i1 = (long long)!__builtin_is_constant_evaluated() * (1ll << 33); //#2
```
before the patch, #2 was diagnosed incorrectly and #1 wasn't diagnosed.
after the patch #1 is diagnosed as it should and #2 isn't.
Changes:
- add a flag to Sema to passe in constant context mode.
- in SemaChecking.cpp calls to Expr::Evaluate* are now done in constant context when they should.
- in SemaChecking.cpp diagnostics for UB are not checked for in constant context because an error will be emitted by the constant evaluator.
- in SemaChecking.cpp diagnostics for construct that cannot appear in constant context are not checked for in constant context.
- in SemaChecking.cpp diagnostics on constant expression are always emitted because constant expression are always evaluated.
- semantic checking for initialization of constexpr variables is now done in constant context.
- adapt test that were depending on warning changes.
- add test.
Reviewers: rsmith
Reviewed By: rsmith
Subscribers: cfe-commits
Tags: #clang
Differential Revision: https://reviews.llvm.org/D62009
llvm-svn: 363488
Diffstat (limited to 'llvm/lib/Support/BranchProbability.cpp')
0 files changed, 0 insertions, 0 deletions