[PATCH] D124038: [clang] Prevent folding of non-const compound expr
serge via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Mon May 9 05:27:36 PDT 2022
serge-sans-paille updated this revision to Diff 428042.
serge-sans-paille added a comment.
Match GCC behavior here: some test case were previously accepted while having the opposite behavior. This pacth both fixes the original issue and adopt gcc behavior.
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D124038/new/
https://reviews.llvm.org/D124038
Files:
clang/lib/AST/ExprConstant.cpp
clang/test/SemaCXX/constant-expression-cxx11.cpp
clang/test/SemaTemplate/constexpr-instantiate.cpp
Index: clang/test/SemaTemplate/constexpr-instantiate.cpp
===================================================================
--- clang/test/SemaTemplate/constexpr-instantiate.cpp
+++ clang/test/SemaTemplate/constexpr-instantiate.cpp
@@ -219,7 +219,9 @@
static int n;
};
template<const int *N> struct B {};
- template<int N> constexpr int A<N>::k = *(int[N]){N}; // expected-error 1+{{negative}}
+ template <int N> constexpr int A<N>::k = *(int[N]){N}; // expected-error 1+{{negative}} expected-note 1+{{not valid in a constant expression}} expected-note 1+{{declared here}}
+ // expected-error at -1 1+{{must be initialized by a constant expression}}
+
template<int N> int A<N>::n = *(int[N]){0};
template <typename> void f() {
@@ -230,9 +232,9 @@
};
decltype(A<-3>::k) d1 = 0; // ok
- decltype(char{A<-4>::k}) d2 = 0; // expected-note {{instantiation of }} expected-error {{narrow}} expected-note {{cast}}
- decltype(char{A<1>::k}) d3 = 0; // ok
- decltype(char{A<1 + (unsigned char)-1>::k}) d4 = 0; // expected-error {{narrow}} expected-note {{cast}}
+ decltype(char{A<-4>::k}) d2 = 0; // expected-note 1+{{instantiation of }} expected-error {{narrow}} expected-note {{cast}}
+ decltype(char{A<1>::k}) d3 = 0; // expected-note 1+{{instantiation of }} expected-error {{narrow}} expected-note {{cast}}
+ decltype(char{A<1 + (unsigned char)-1>::k}) d4 = 0; // expected-error {{narrow}} expected-note {{cast}} expected-note {{instantiation of}}
}
}
Index: clang/test/SemaCXX/constant-expression-cxx11.cpp
===================================================================
--- clang/test/SemaCXX/constant-expression-cxx11.cpp
+++ clang/test/SemaCXX/constant-expression-cxx11.cpp
@@ -1596,8 +1596,13 @@
// Matching GCC, file-scope array compound literals initialized by constants
// are lifetime-extended.
constexpr int *p = (int*)(int[1]){3}; // expected-warning {{C99}}
- static_assert(*p == 3, "");
+ static_assert(*p == 3, ""); // expected-error {{static_assert expression is not an integral constant expression}}
+ // expected-note at -1 {{subexpression not valid}}
+ // expected-note at -3 {{declared here}}
static_assert((int[2]){1, 2}[1] == 2, ""); // expected-warning {{C99}}
+ // expected-error at -1 {{static_assert expression is not an integral constant expression}}
+ // expected-note at -2 {{subexpression not valid}}
+ // expected-note at -3 {{declared here}}
// Other kinds are not.
struct X { int a[2]; };
Index: clang/lib/AST/ExprConstant.cpp
===================================================================
--- clang/lib/AST/ExprConstant.cpp
+++ clang/lib/AST/ExprConstant.cpp
@@ -4259,9 +4259,21 @@
Info.FFDiag(Conv);
return false;
}
+
+ // Dereferencing a pointer to an array of CompoundLiteralExpr requires the
+ // latter to be const.
+ QualType CLETy = CLE->getType();
+ bool IsConstant = CLETy.isConstant(Info.Ctx);
+ if (!IsConstant && CLETy->isArrayType()) {
+ Info.FFDiag(Conv);
+ Info.Note(CLE->getExprLoc(), diag::note_declared_at);
+ return false;
+ }
+
APValue Lit;
if (!Evaluate(Lit, Info, CLE->getInitializer()))
return false;
+
CompleteObject LitObj(LVal.Base, &Lit, Base->getType());
return extractSubobject(Info, Conv, LitObj, LVal.Designator, RVal, AK);
} else if (isa<StringLiteral>(Base) || isa<PredefinedExpr>(Base)) {
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D124038.428042.patch
Type: text/x-patch
Size: 3587 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20220509/3995d973/attachment.bin>
More information about the cfe-commits
mailing list