1. 01 Feb, 2017 1 commit
    • Hans Wennborg's avatar
      Merging r293360: · ccd67298
      Hans Wennborg authored
      ------------------------------------------------------------------------
      r293360 | gbiv | 2017-01-27 18:19:40 -0800 (Fri, 27 Jan 2017) | 11 lines
      
      Change how we handle diagnose_if attributes.
      
      This patch changes how we handle argument-dependent `diagnose_if`
      attributes. In particular, we now check them in the same place that we
      check for things like passing NULL to Nonnull args, etc. This is
      basically better in every way than how we were handling them before. :)
      
      This fixes PR31638, PR31639, and PR31640.
      
      Differential Revision: https://reviews.llvm.org/D28889
      
      ------------------------------------------------------------------------
      Merging r293369:
      ------------------------------------------------------------------------
      r293369 | gbiv | 2017-01-27 20:16:32 -0800 (Fri, 27 Jan 2017) | 7 lines
      
      Attempt to unbreak buildbots.
      
      r293360 broke some ARM bots, because size_t on those targets is
      apparently `unsigned int`, not `unsigned long`. `sizeof(whatever)`
      should to give us a `size_t`, so we can just use the type of that
      instead.
      
      ------------------------------------------------------------------------
      
      
      git-svn-id: https://llvm.org/svn/llvm-project/cfe/branches/release_40@293784 91177308-0d34-0410-b5e6-96231b3b80d8
      ccd67298
  2. 09 Jan, 2017 1 commit
    • George Burgess IV's avatar
      Add the diagnose_if attribute to clang. · 5a6ff0d5
      George Burgess IV authored
      `diagnose_if` can be used to have clang emit either warnings or errors
      for function calls that meet user-specified conditions. For example:
      
      ```
      constexpr int foo(int a)
        __attribute__((diagnose_if(a > 10, "configurations with a > 10 are "
                                            "expensive.", "warning")));
      
      int f1 = foo(9);
      int f2 = foo(10); // warning: configuration with a > 10 are expensive.
      int f3 = foo(f2);
      ```
      
      It currently only emits diagnostics in cases where the condition is
      guaranteed to always be true. So, the following code will emit no
      warnings:
      
      ```
      constexpr int bar(int a) {
        foo(a);
        return 0;
      }
      
      constexpr int i = bar(10);
      ```
      
      We hope to support optionally emitting diagnostics for cases like that
      (and emitting runtime checks) in the future.
      
      Release notes will appear shortly. :)
      
      Differential Revision: https://reviews.llvm.org/D27424
      
      
      git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@291418 91177308-0d34-0410-b5e6-96231b3b80d8
      5a6ff0d5