diff options
| author | James Clarke <jrtc27@jrtc27.com> | 2019-10-08 02:28:57 +0000 |
|---|---|---|
| committer | James Clarke <jrtc27@jrtc27.com> | 2019-10-08 02:28:57 +0000 |
| commit | 66e276862781f6edc4e757695e20b69b3fb11d49 (patch) | |
| tree | 96e2180596c8e19c5dcdb2fb264250166c6fc138 | |
| parent | d6609a404fecafe479be8a012b99e3f278f86275 (diff) | |
| download | llvm-66e276862781f6edc4e757695e20b69b3fb11d49.zip llvm-66e276862781f6edc4e757695e20b69b3fb11d49.tar.gz llvm-66e276862781f6edc4e757695e20b69b3fb11d49.tar.bz2 | |
[ItaniumMangle] Fix mangling of GNU __null in an expression to match GCC
Reviewers: rsmith
Reviewed By: rsmith
Subscribers: erik.pilkington, cfe-commits
Tags: #clang
Differential Revision: https://reviews.llvm.org/D68368
llvm-svn: 374013
| -rw-r--r-- | clang/lib/AST/ItaniumMangle.cpp | 7 | ||||
| -rw-r--r-- | clang/test/CodeGenCXX/mangle-exprs.cpp | 16 |
2 files changed, 21 insertions, 2 deletions
diff --git a/clang/lib/AST/ItaniumMangle.cpp b/clang/lib/AST/ItaniumMangle.cpp index bea96de..c6f7143 100644 --- a/clang/lib/AST/ItaniumMangle.cpp +++ b/clang/lib/AST/ItaniumMangle.cpp @@ -4273,8 +4273,11 @@ recurse: } case Expr::GNUNullExprClass: - // FIXME: should this really be mangled the same as nullptr? - // fallthrough + // Mangle as if an integer literal 0. + Out << 'L'; + mangleType(E->getType()); + Out << "0E"; + break; case Expr::CXXNullPtrLiteralExprClass: { Out << "LDnE"; diff --git a/clang/test/CodeGenCXX/mangle-exprs.cpp b/clang/test/CodeGenCXX/mangle-exprs.cpp index 6c46402..1b99272 100644 --- a/clang/test/CodeGenCXX/mangle-exprs.cpp +++ b/clang/test/CodeGenCXX/mangle-exprs.cpp @@ -373,3 +373,19 @@ namespace designated_init { template<typename T> void f(decltype(T{.a.b[3][1 ... 4] = 9}) x) {} void use_f(A a) { f<A>(a); } } + +namespace null { + template <decltype(nullptr) P> + void cpp_nullptr(typename enable_if<P == nullptr>::type* = 0) { + } + + template <void *P> + void gnu_null(typename enable_if<P == __null>::type* = 0) { + } + + // CHECK-LABEL: define {{.*}} @_ZN4null11cpp_nullptrILDn0EEEvPN9enable_ifIXeqT_LDnEEvE4typeE + template void cpp_nullptr<nullptr>(void *); + + // CHECK-LABEL: define {{.*}} @_ZN4null8gnu_nullILPv0EEEvPN9enable_ifIXeqT_Ll0EEvE4typeE + template void gnu_null<nullptr>(void *); +} |
