diff --git a/gcc/ipa-pure-const.cc b/gcc/ipa-pure-const.cc index 572a6da274ffce6bf6e14823a07f405e487c3597..0b748eee0eeb70753f2ed5b3c4f80b61d72f4a52 100644 --- a/gcc/ipa-pure-const.cc +++ b/gcc/ipa-pure-const.cc @@ -1526,8 +1526,9 @@ ipa_make_function_pure (struct cgraph_node *node, bool looping, bool local) { bool cdtor = false; - if (DECL_PURE_P (node->decl) - && (looping || !DECL_LOOPING_CONST_OR_PURE_P (node->decl))) + if (TREE_READONLY (node->decl) + || (DECL_PURE_P (node->decl) + && (looping || !DECL_LOOPING_CONST_OR_PURE_P (node->decl)))) return false; warn_function_pure (node->decl, !looping); if (local && skip_function_for_local_pure_const (node)) diff --git a/gcc/testsuite/gcc.dg/pr105676.c b/gcc/testsuite/gcc.dg/pr105676.c new file mode 100644 index 0000000000000000000000000000000000000000..077fc18a17f37a6a7a49b18ab52537a1d5040827 --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr105676.c @@ -0,0 +1,14 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -Wsuggest-attribute=pure" } */ + +__attribute__((const)) +extern int do_expensive_calculation(void); + +__attribute__((const)) +int getval(void) /* { dg-bogus "candidate for attribute" } */ +{ + static int cache = -1; + if (cache == -1) + cache = do_expensive_calculation(); + return cache; +}