george.burgess.iv added inline comments.

================
Comment at: include/clang/Basic/Attr.td:753
@@ +752,3 @@
+  let Args = [IntArgument<"ElemSizeParam">, IntArgument<"NumElemsParam", 1>];
+  let TemplateDependent = 1;
+  let Documentation = [AllocSizeDocs];
----------------
aaron.ballman wrote:
> I don't see any C++ tests involving templates; can you add some?
Good catch

================
Comment at: test/SemaCXX/constant-expression-cxx11.cpp:1171
@@ -1170,3 +1170,3 @@
   int l : n3; // expected-error {{constant expression}} expected-note {{read 
of non-const variable}}
-  int m : t.n; // expected-error {{constant expression}} expected-note {{read 
of non-constexpr variable}}
+  int m : t.n; // expected-warning{{width of bit-field 'm' (42 bits)}}
 };
----------------
aaron.ballman wrote:
> This change seems out of place for a test that doesn't use alloc_size 
> anywhere. Can you explain why this test has changed?
Yup!

Clang's constexpr evaluator is conservative about `const` variables. If it kept 
this attitude, `alloc_size` evaluation can't happen in non-constexpr contexts 
in clang, even in cases like:

```
int foo() {
  void *const p = malloc(10);
  return __builtin_object_size(p, 0);
}
```

The change I made at ExprConstant.cpp:2789 (which Richard okayed when I talked 
with him offline) makes the constexpr evaluator more willing to look at const 
variables. With that, we can fold calls to `__builtin_object_size` like above 
in clang.

It also means that there are a few cases outside of `alloc_size` where the 
constexpr evaluator can be more aggressive. As it turns out, this is one of 
them (as is the change in test/CodeGenCXX/global-init.cpp, IIRC)


http://reviews.llvm.org/D14274



_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to