[PATCH] D79160: [AST] Preserve the type in RecoveryExprs for broken function calls.

Haojian Wu via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Fri May 8 08:00:48 PDT 2020


hokein marked an inline comment as done.
hokein added inline comments.


================
Comment at: clang/test/SemaCXX/enable_if.cpp:417
 
-constexpr int B = 10 + // the carat for the error should be pointing to the problematic call (on the next line), not here.
-    callTemplated<0>(); // expected-error{{initialized by a constant expression}} expected-error at -3{{no matching function for call to 'templated'}} expected-note{{in instantiation of function template}} expected-note at -10{{candidate disabled}}
+constexpr int B = 10 + // expected-error {{initialized by a constant expression}}
+    callTemplated<0>(); // expected-error at -3{{no matching function for call to 'templated'}} expected-note{{in instantiation of function template}} expected-note at -10{{candidate disabled}} expected-note {{in call to 'callTemplated()'}} expected-note at -3 {{subexpression not valid in a constant expression}}
----------------
hokein wrote:
> sammccall wrote:
> > hokein wrote:
> > > this diagnostic is changed slightly (without `-frecovery-ast-type`). I think this is acceptable.
> > > 
> > > before this patch:
> > > 
> > > ```
> > > /tmp/t5.cpp:7:10: error: no matching function for call to 'templated'
> > >   return templated<N>();  // expected-error {{no matching function for call to 'templated'}} 
> > >          ^~~~~~~~~~~~
> > > /tmp/t5.cpp:13:5: note: in instantiation of function template specialization 'enable_if_diags::callTemplated<0>' requested here
> > >     callTemplated<0>(); // expected-note {{in call to 'callTemplated()'}} expected-note at -6 {{subexpression not valid in a constant expression}}
> > >     ^
> > > /tmp/t5.cpp:2:32: note: candidate disabled: <no message provided>
> > > template <int N> constexpr int templated() __attribute__((enable_if(N, ""))) {
> > >                                ^                                    ~
> > > /tmp/t5.cpp:13:5: error: constexpr variable 'B' must be initialized by a constant expression
> > >     callTemplated<0>(); // expected-note {{in call to 'callTemplated()'}} expected-note at -6 {{subexpression not valid in a constant expression}}
> > >     ^~~~~~~~~~~~~~~~~~
> > > 2 errors generated.
> > > ```
> > > 
> > > vs after this patch:
> > > 
> > > ```
> > > /tmp/t5.cpp:7:10: error: no matching function for call to 'templated'
> > >   return templated<N>();  // expected-error {{no matching function for call to 'templated'}} 
> > >          ^~~~~~~~~~~~
> > > /tmp/t5.cpp:13:5: note: in instantiation of function template specialization 'enable_if_diags::callTemplated<0>' requested here
> > >     callTemplated<0>(); // expected-note {{in call to 'callTemplated()'}} expected-note at -6 {{subexpression not valid in a constant expression}}
> > >     ^
> > > /tmp/t5.cpp:2:32: note: candidate disabled: <no message provided>
> > > template <int N> constexpr int templated() __attribute__((enable_if(N, ""))) {
> > >                                ^                                    ~
> > > /tmp/t5.cpp:12:15: error: constexpr variable 'B' must be initialized by a constant expression
> > > constexpr int B = 10 +  // expected-error {{constexpr variable 'B' must be initialized by a constant expression}}
> > >               ^   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
> > > /tmp/t5.cpp:7:10: note: subexpression not valid in a constant expression
> > >   return templated<N>();  // expected-error {{no matching function for call to 'templated'}} 
> > >          ^
> > > /tmp/t5.cpp:13:5: note: in call to 'callTemplated()'
> > >     callTemplated<0>(); // expected-note {{in call to 'callTemplated()'}} expected-note at -6 {{subexpression not valid in a constant expression}}
> > >     ^
> > > 2 errors generated.
> > > ```
> > > 
> > > 
> > Yeah, this is noisier but seems OK.
> > Can you take a look at the blame for the split-line test and see if there was any special code to support it that can be cleaned up?
> `git blame` showed https://github.com/llvm/llvm-project/commit/c7d3e609fbf05d1a1236f99efd1e2fd344554f4b, but I didn't see any special code that we need clean up.
actually we don't need this change if we land this patch before the enable-recovery-expr patch, defer this change to D78350.


================
Comment at: clang/test/SemaTemplate/instantiate-function-params.cpp:1
 // RUN: %clang_cc1 -triple i686-unknown-unknown -fsyntax-only -verify %s
 
----------------
sammccall wrote:
> hokein wrote:
> > this test is very tricky, and hard for human to understand. It was added to test clang not crashing.
> > 
> > Different compilers (gcc, msvc) emit different diagnostics, with this patch, clang emits 3 more errs `no type named 'type'...`, it seems reasonable, and gcc also emits them.
> Ugh, I remember this test. It's partially reduced from boost IIRC.
the same to this file, defer it to D78350.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D79160/new/

https://reviews.llvm.org/D79160





More information about the cfe-commits mailing list