Author: Richard Smith Date: 2020-10-26T16:59:48-07:00 New Revision: a5c7b46862ec0531964eb52329cdf009862abecf
URL: https://github.com/llvm/llvm-project/commit/a5c7b46862ec0531964eb52329cdf009862abecf DIFF: https://github.com/llvm/llvm-project/commit/a5c7b46862ec0531964eb52329cdf009862abecf.diff LOG: Fix checking for C++98 ICEs in C++11-and-later mode to not consider use of a reference to be acceptable. Added: Modified: clang/lib/AST/ExprConstant.cpp clang/test/SemaCXX/MicrosoftCompatibility.cpp Removed: ################################################################################ diff --git a/clang/lib/AST/ExprConstant.cpp b/clang/lib/AST/ExprConstant.cpp index fa4026b865fb..0b1293b3a2c7 100644 --- a/clang/lib/AST/ExprConstant.cpp +++ b/clang/lib/AST/ExprConstant.cpp @@ -15173,8 +15173,12 @@ static ICEDiag CheckICE(const Expr* E, const ASTContext &Ctx) { // C++ 7.1.5.1p2 // A variable of non-volatile const-qualified integral or enumeration // type initialized by an ICE can be used in ICEs. + // + // We sometimes use CheckICE to check the C++98 rules in C++11 mode. In + // that mode, use of reference variables should not be allowed. const VarDecl *VD = dyn_cast<VarDecl>(D); - if (VD && VD->isUsableInConstantExpressions(Ctx)) + if (VD && VD->isUsableInConstantExpressions(Ctx) && + !VD->getType()->isReferenceType()) return NoDiag(); return ICEDiag(IK_NotICE, E->getBeginLoc()); diff --git a/clang/test/SemaCXX/MicrosoftCompatibility.cpp b/clang/test/SemaCXX/MicrosoftCompatibility.cpp index 453f78ad43df..8c0a000da07c 100644 --- a/clang/test/SemaCXX/MicrosoftCompatibility.cpp +++ b/clang/test/SemaCXX/MicrosoftCompatibility.cpp @@ -275,6 +275,17 @@ namespace IntToNullPtrConv { template<int N> int *get_n() { return N; } // expected-warning {{expression which evaluates to zero treated as a null pointer constant}} int *g_nullptr = get_n<0>(); // expected-note {{in instantiation of function template specialization}} + + // FIXME: MSVC accepts this. + constexpr float k = 0; + int *p1 = (int)k; // expected-error {{cannot initialize}} + + constexpr int n = 0; + const int &r = n; + int *p2 = (int)r; // expected-error {{cannot initialize}} + + constexpr int f() { return 0; } + int *p = f(); // expected-error {{cannot initialize}} } namespace signed_hex_i64 { _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits