[clang] [clang][bytecode] Diagnose IntegralToPointer casts to non-void (PR #123619)
https://github.com/tbaederr closed https://github.com/llvm/llvm-project/pull/123619 ___ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [clang][bytecode] Diagnose IntegralToPointer casts to non-void (PR #123619)
llvmbot wrote:
@llvm/pr-subscribers-clang
Author: Timm Baeder (tbaederr)
Changes
But keep evaluating. This is what the current interpreter does as well.
---
Full diff: https://github.com/llvm/llvm-project/pull/123619.diff
3 Files Affected:
- (modified) clang/lib/AST/ByteCode/Interp.h (+4)
- (modified) clang/test/AST/ByteCode/constexpr.c (+2-2)
- (modified) clang/test/SemaCXX/builtin-assume-aligned.cpp (-1)
``diff
diff --git a/clang/lib/AST/ByteCode/Interp.h b/clang/lib/AST/ByteCode/Interp.h
index 58c0256c7d7df8..11e9738eff5dcd 100644
--- a/clang/lib/AST/ByteCode/Interp.h
+++ b/clang/lib/AST/ByteCode/Interp.h
@@ -2693,6 +2693,10 @@ template ::T>
inline bool GetIntPtr(InterpState &S, CodePtr OpPC, const Descriptor *Desc) {
const T &IntVal = S.Stk.pop();
+ if (Desc)
+S.CCEDiag(S.Current->getSource(OpPC), diag::note_constexpr_invalid_cast)
+<< 2 << S.getLangOpts().CPlusPlus;
+
S.Stk.push(static_cast(IntVal), Desc);
return true;
}
diff --git a/clang/test/AST/ByteCode/constexpr.c
b/clang/test/AST/ByteCode/constexpr.c
index fed24fa72b2541..af96bf3a06f375 100644
--- a/clang/test/AST/ByteCode/constexpr.c
+++ b/clang/test/AST/ByteCode/constexpr.c
@@ -309,8 +309,8 @@ constexpr const int *V81 = &V80;
constexpr int *V82 = 0;
constexpr int *V83 = V82;
constexpr int *V84 = 42;
-// ref-error@-1 {{constexpr variable 'V84' must be initialized by a constant
expression}}
-// ref-note@-2 {{this conversion is not allowed in a constant expression}}
+// both-error@-1 {{constexpr variable 'V84' must be initialized by a constant
expression}}
+// both-note@-2 {{this conversion is not allowed in a constant expression}}
// both-error@-3 {{constexpr pointer initializer is not null}}
constexpr int *V85 = nullptr;
diff --git a/clang/test/SemaCXX/builtin-assume-aligned.cpp
b/clang/test/SemaCXX/builtin-assume-aligned.cpp
index 85a7faee916181..48bd8414fc50a1 100644
--- a/clang/test/SemaCXX/builtin-assume-aligned.cpp
+++ b/clang/test/SemaCXX/builtin-assume-aligned.cpp
@@ -1,5 +1,4 @@
// RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 -triple x86_64-linux-gnu %s
-// RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 -triple x86_64-linux-gnu
%s -fexperimental-new-constant-interpreter
int n;
constexpr int *p = 0;
``
https://github.com/llvm/llvm-project/pull/123619
___
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [clang][bytecode] Diagnose IntegralToPointer casts to non-void (PR #123619)
https://github.com/tbaederr created
https://github.com/llvm/llvm-project/pull/123619
But keep evaluating. This is what the current interpreter does as well.
>From 3ba917b703c05da898515923e17db03850c807e6 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Timm=20B=C3=A4der?=
Date: Mon, 20 Jan 2025 14:19:48 +0100
Subject: [PATCH] [clang][bytecode] Diagnose IntegralToPointer casts to
non-void
But keep evaluating. This is what the current interpreter does as well.
---
clang/lib/AST/ByteCode/Interp.h | 4
clang/test/AST/ByteCode/constexpr.c | 4 ++--
clang/test/SemaCXX/builtin-assume-aligned.cpp | 1 -
3 files changed, 6 insertions(+), 3 deletions(-)
diff --git a/clang/lib/AST/ByteCode/Interp.h b/clang/lib/AST/ByteCode/Interp.h
index 58c0256c7d7df8..11e9738eff5dcd 100644
--- a/clang/lib/AST/ByteCode/Interp.h
+++ b/clang/lib/AST/ByteCode/Interp.h
@@ -2693,6 +2693,10 @@ template ::T>
inline bool GetIntPtr(InterpState &S, CodePtr OpPC, const Descriptor *Desc) {
const T &IntVal = S.Stk.pop();
+ if (Desc)
+S.CCEDiag(S.Current->getSource(OpPC), diag::note_constexpr_invalid_cast)
+<< 2 << S.getLangOpts().CPlusPlus;
+
S.Stk.push(static_cast(IntVal), Desc);
return true;
}
diff --git a/clang/test/AST/ByteCode/constexpr.c
b/clang/test/AST/ByteCode/constexpr.c
index fed24fa72b2541..af96bf3a06f375 100644
--- a/clang/test/AST/ByteCode/constexpr.c
+++ b/clang/test/AST/ByteCode/constexpr.c
@@ -309,8 +309,8 @@ constexpr const int *V81 = &V80;
constexpr int *V82 = 0;
constexpr int *V83 = V82;
constexpr int *V84 = 42;
-// ref-error@-1 {{constexpr variable 'V84' must be initialized by a constant
expression}}
-// ref-note@-2 {{this conversion is not allowed in a constant expression}}
+// both-error@-1 {{constexpr variable 'V84' must be initialized by a constant
expression}}
+// both-note@-2 {{this conversion is not allowed in a constant expression}}
// both-error@-3 {{constexpr pointer initializer is not null}}
constexpr int *V85 = nullptr;
diff --git a/clang/test/SemaCXX/builtin-assume-aligned.cpp
b/clang/test/SemaCXX/builtin-assume-aligned.cpp
index 85a7faee916181..48bd8414fc50a1 100644
--- a/clang/test/SemaCXX/builtin-assume-aligned.cpp
+++ b/clang/test/SemaCXX/builtin-assume-aligned.cpp
@@ -1,5 +1,4 @@
// RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 -triple x86_64-linux-gnu %s
-// RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 -triple x86_64-linux-gnu
%s -fexperimental-new-constant-interpreter
int n;
constexpr int *p = 0;
___
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
