diff options
| author | Richard Smith <richard-llvm@metafoo.co.uk> | 2013-05-23 00:30:41 +0000 |
|---|---|---|
| committer | Richard Smith <richard-llvm@metafoo.co.uk> | 2013-05-23 00:30:41 +0000 |
| commit | a23ab514c2a126bcdfd30f3edaf4da6800bcd534 (patch) | |
| tree | 7051d1cc2458bb979558e0e2157bd122a8ce70e7 /clang/test | |
| parent | d389cc3a2e74319cde7b8c49acc915ac4ca06ec6 (diff) | |
| download | bcm5719-llvm-a23ab514c2a126bcdfd30f3edaf4da6800bcd534.tar.gz bcm5719-llvm-a23ab514c2a126bcdfd30f3edaf4da6800bcd534.zip | |
PR14772: Support constant expression evaluation for _Atomic types.
* Treat _Atomic(T) as a literal type if T is a literal type.
* Evaluate expressions of this type properly.
* Fix a lurking bug where we built completely bogus ASTs for converting to
_Atomic types in C++ in some cases, caught by the tests for this change.
llvm-svn: 182541
Diffstat (limited to 'clang/test')
| -rw-r--r-- | clang/test/SemaCXX/constant-expression-cxx11.cpp | 25 |
1 files changed, 25 insertions, 0 deletions
diff --git a/clang/test/SemaCXX/constant-expression-cxx11.cpp b/clang/test/SemaCXX/constant-expression-cxx11.cpp index 97b0b91b99f..9beacf887e1 100644 --- a/clang/test/SemaCXX/constant-expression-cxx11.cpp +++ b/clang/test/SemaCXX/constant-expression-cxx11.cpp @@ -1138,6 +1138,31 @@ namespace ComplexConstexpr { static_assert(&__imag test6 == &__real test6 + 1, ""); } +// _Atomic(T) is exactly like T for the purposes of constant expression +// evaluation.. +namespace Atomic { + constexpr _Atomic int n = 3; + + struct S { _Atomic(double) d; }; + constexpr S s = { 0.5 }; + constexpr double d1 = s.d; + constexpr double d2 = n; + constexpr _Atomic double d3 = n; + + constexpr _Atomic(int) n2 = d3; + static_assert(d1 == 0.5, ""); + static_assert(d3 == 3.0, ""); + + namespace PR16056 { + struct TestVar { + _Atomic(int) value; + constexpr TestVar(int value) : value(value) {} + }; + constexpr TestVar testVar{-1}; + static_assert(testVar.value == -1, ""); + } +} + namespace InstantiateCaseStmt { template<int x> constexpr int f() { return x; } template<int x> int g(int c) { switch(c) { case f<x>(): return 1; } return 0; } |

