case CALL_EXPR: /* We have a special meaning for volatile void fn(). */
/* cdtors may return this or void, depending on
targetm.cxx.cdtor_returns_this, but this shouldn't affect our
- decisions here: neither nodiscard warnings (nodiscard cdtors
- are nonsensical), nor should any constexpr or template
- instantiations be affected by an ABI property that is, or at
- least ought to be transparent to the language. */
+ decisions here: neither nodiscard warnings (nodiscard dtors
+ are nonsensical and ctors have a different behavior with that
+ attribute that is handled in the TARGET_EXPR case), nor should
+ any constexpr or template instantiations be affected by an ABI
+ property that is, or at least ought to be transparent to the
+ language. */
if (tree fn = cp_get_callee_fndecl_nofold (expr))
- if (DECL_DESTRUCTOR_P (fn))
+ if (DECL_CONSTRUCTOR_P (fn) || DECL_DESTRUCTOR_P (fn))
return expr;
if (complain & tf_warning)
/* nodiscard attribute tests */
/* { dg-do compile { target c++20 } } */
-/* { dg-options "-O -ftrack-macro-expansion=0" } */
+/* { dg-options "-O" } */
struct A { [[nodiscard("bad constructor")]] A() {} };
struct B { [[nodiscard]] B() {} };
void
test (void)
{
- A{}; /* { dg-warning "(?n)nodiscard.*bad constructor" } */
- B{}; /* { dg-warning "(?n)nodiscard" } */
+ A{}; /* { dg-warning "nodiscard\[^\n\r]*bad constructor" } */
+ B{}; /* { dg-warning "nodiscard" } */
}
--- /dev/null
+// PR c++/99362
+// { dg-do compile { target c++20 } }
+
+struct S {
+ [[nodiscard]] S() {}
+ S(int) {}
+};
+
+int main()
+{
+ S s;
+ S(); // { dg-warning "ignoring return value" }
+ (void)(S());
+ S t = 1;
+ S(1);
+ (void)(S(1));
+}
/* nodiscard attribute tests */
/* { dg-do compile { target c++20 } } */
-/* { dg-options "-O -ftrack-macro-expansion=0" } */
+/* { dg-options "-O" } */
[[nodiscard, nodiscard]] int check1 (void); // { dg-warning "specified multiple times" }
/* nodiscard attribute tests */
/* { dg-do compile { target c++20 } } */
-/* { dg-options "-O -ftrack-macro-expansion=0" } */
+/* { dg-options "-O" } */
[[nodiscard(123)]] int check1 (void); /* { dg-error "nodiscard\[^\n\r]*must be a string constant" } */
/* nodiscard attribute tests */
/* { dg-do compile { target c++20 } } */
-/* { dg-options "-O -ftrack-macro-expansion=0" } */
+/* { dg-options "-O" } */
[[nodiscard("not", "allowed")]] int check1 (void); /* { dg-error "wrong number of arguments.\[^\n\r]*nodiscard" } */